Gejala
Ketika kode yang mentargetkan Microsoft .NET Framework 4.5.1 atau Microsoft .NET Framework 4.5.2, dan kode dinamis mengikat metode (misalnya, menggunakan skrip Windows PowerShell, IronPython, IronRuby atau bahasa dinamis lainnya) memanggil metode System.Runtime.InteropServices.Marshal.SizeOf atau metode System.Runtime.InteropServices.Marshal.PtrToStructure , Anda mungkin mengalami masalah berikut ini.
Catatan Kode yang telah dikumpulkan ke eksekusi terkelola tidak menunjukkan masalah ini, kecuali kode yang menggunakan kata kunci dinamis di C#.
Masalah 1
Panggilan ke System.Runtime.InteropServices.Marshal.SizeOf membuang pengecualian MethodInvocationException berikut ini:
Ketik ' <nama jenis>' tidak dapat marshalled sebagai struktur tidak dikelola; tidak berarti ukuran atau offset dapat dihitung.
Masalah 2
Panggilan ke System.Runtime.InteropServices.Marshal.PtrToStructure membuang pengecualian MethodInvocationException berikut ini:
Struktur tertentu harus blittable atau memiliki informasi tata letak.
Masalah 3
Panggilan ke System.Runtime.InteropServices.Marshal.PtrToStructure membuang pengecualian RuntimeBinderException berikut ini:
Implisit tidak dapat mengubah jenis 'Batal' 'objek'.
Penyebab
Masalah ini terjadi karena skrip mesin dan bahasa dinamis dapat mengikat berlebihan baru yang diperkenalkan di .NET Framework. Khususnya, panggilan yang sebelumnya digunakan Marshal.SizeOf(Type) sekarang dapat memanggil Marshal.SizeOf < T > (T), dan panggilan yang digunakan Marshal.PtrToStructure (IntPtr, jenis) sekarang dapat memanggil Marshal.PtrToStructure < T >(IntPtr, T). Perubahan ini menyebabkan metode atau binder runtime untuk membuang pengecualian.
Pemecahan masalah
Untuk mengatasi masalah ini, Ubah kode sehingga menggunakan berlebihan benar jika bahasa Anda memungkinkan Anda untuk melakukannya. Jika Anda tidak dapat menentukan metode tertentu yang berlebihan, Ubah kode sehingga menggunakan metode yang baru berlebihan dengan benar sebagai gantinya.
Untuk C# permintaan dinamis
Menambah pemain System.Type dalam panggilan ke metode SizeOf atau metode PtrToStructure. Misalnya:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Catatan Hal ini hanya diperlukan jika salah satu argumen metode dinamis.
Untuk skrip Windows PowerShell
Menambah pemain System.Type dalam panggilan ke metode SizeOf atau metode PtrToStructure. Misalnya:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Untuk skrip IronPython
Membuat contoh jenis baru dari jenis, dan kemudian gunakan metode yang baru berlebihan. Misalnya:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)
obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Status
Microsoft telah memastikan bahwa ini merupakan masalah di dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".