Belirtiler
4.5.1 Microsoft .NET Framework veya Microsoft .NET Framework 4.5.2 ve kod dinamik olarak hedefleyen kod bağlar (örneğin, Windows PowerShell, IronPython, IronRuby veya başka bir dinamik dil komut dosyası kullanarak) yöntemleri System.Runtime.InteropServices.Marshal.sizeof veya System.Runtime.InteropServices.Marshal.PtrToStructure yöntemini çağırır, aşağıdaki sorunlarla karşılaşabilirsiniz.
Not: Bu kod C# ' ta dynamic anahtar kullanmadıkça yönetilen bir yürütülebilir dosyada önceden derlenmiş kod bu sorunlar getirmeyi göstermez.
Sorun 1
System.Runtime.InteropServices.Marshal.sizeof çağrıları aşağıdaki MethodInvocationException özel durum:
Türü ' <türü adı>' yönetilmeyen bir yapıyı sıraya olamaz; anlamlı boyutu ya da uzaklık hesaplanabilir.
Sorun 2
System.Runtime.InteropServices.Marshal.PtrToStructure çağrıları aşağıdaki MethodInvocationException özel durum:
Belirtilen yapıya blittable veya yerleşim bilgilerine sahip gerekir.
Sorun 3
System.Runtime.InteropServices.Marshal.PtrToStructure çağrıları aşağıdaki RuntimeBinderException özel durum:
Dolaylı olarak 'için 'object' void' türü dönüştürülemiyor.
Neden
Komut dosyası altyapılarındaki nedeniyle bu sorun oluşur ve dinamik dillerin .NET Framework içinde tanıtılan yeni bir aşırı bağlamak. Özellikle, eskiden Marshal.SizeOf(Type) kullanılan şimdi çağrılarına Marshal.SizeOf < T > (T)ve Marshal.PtrToStructure (IntPtr, türü) kullanılan şimdi çağrılarına Marshal.PtrToStructure < T >(IntPtr, T). Bu değişiklik, yöntemler veya bir özel durum için çalışma zamanı cilt neden olur.
Geçici çözüm
Bu soruna geçici bir çözüm için dilinizi, bunu yapmanızı sağlar, doğru aşırı yüklemeyi kullanır, böylece kodu değiştirin. Belirli yöntem yüklemesini belirtemiyorsanız, böylece yeni yöntem yüklemesini doğru yerine kullandığı kodu değiştirin.
C# dinamik çağrı için
Bir dönüştürme için System.Type içinde SizeOf veya PtrToStructureyöntemini çağrısı ekleyin. Örneğin:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Not: Bu sadece bir yöntem için bağımsız değişkenlerden biri dinamik olduğunda gereklidir.
Windows PowerShell komut dosyaları için
Bir dönüştürme için System.Type içinde SizeOf veya PtrToStructureyöntemini çağrısı ekleyin. Örneğin:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
IronPython komut dosyaları için
Yeni bir tür örnek türü oluşturabilir ve sonra yeni yöntem yüklemesini kullanın. Örneğin:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Durum
Microsoft bu sorunun "Aşağıdakilere Uygulanır" bölümünde listelenen Microsoft ürünlerinde bulunduğunu onaylamıştır.