Objawy
Gdy kod, który jest przeznaczony dla programu Microsoft.NET Framework 4.5.1 lub Microsoft.NET Framework 4.5.2 i kod dynamicznie wiąże się z metod (na przykład za pomocą skryptu programu Windows PowerShell, IronPython, IronRuby lub innego języka dynamicznego) wywołuje metodę System.Runtime.InteropServices.Marshal.PtrToStructure lub metodęsystem.Runtime.InteropServices.Marshal.sizeof , mogą wystąpić następujące problemy.
Uwaga: Kod, który już jest skompilowany do zarządzany plik wykonywalny nie wykazują te problemy, chyba że kod używa słowa kluczowego w języku C#.Problem 1
Wywołania System.Runtime.InteropServices.Marshal.SizeOf następującego wyjątku MethodInvocationException :
Typu ' <Nazwa typu>' nie może być skierowany jako struktura niezarządzana; można obliczyć akceptowalnego rozmiaru ani przesunięcia.
Problem 2
Wywołania System.Runtime.InteropServices.Marshal.PtrToStructure następującego wyjątku MethodInvocationException :
Określonej struktury musi istnieć możliwość kopiowania lub zawierać informacji o układzie.
Problem 3
Wywołania System.Runtime.InteropServices.Marshal.PtrToStructure następującego wyjątku RuntimeBinderException :
Nie można niejawnie przekonwertować typu "void" do "object".
Przyczyna
Ten problem występuje, ponieważ skryptów i dynamicznych języków może zostać powiązany z nowego przeciążenia, wprowadzone w.NET Framework. W szczególności, wywołania, które poprzednio używane Marshal.SizeOf(Type) teraz może wywołać Marshal.SizeOf < T > (T)i wywołania, które używane Marshal.PtrToStructure (IntPtr, Type) teraz może wywołać Marshal.PtrToStructure < T >(IntPtr, T). Ta zmiana powoduje metod lub spinacza runtime Zgłaszanie wyjątku.
Obejście problemu
Aby obejść ten problem, należy zmienić kod, tak, że jeśli język umożliwia tym używa poprawne przeciążenie. Jeśli nie określisz przeciążenie określonej metody, należy zmienić kod tak, aby używała nowego przeciążenia metody poprawnie w zamian.
C# dynamiczne wywołania
Dodaj oddanych do System.Type w wywołaniu metody SizeOf lub ptrtostructure. Na przykład:
object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
Uwaga: Jest to konieczne tylko wtedy, gdy jeden z argumentów do metody jest dynamiczny.
Dla skryptów środowiska Windows PowerShell
Dodaj oddanych do System.Type w wywołaniu metody SizeOf lub ptrtostructure. Na przykład:
$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)
Dla skryptów Boo
Utwórz nowe wystąpienie typu tego typu, a następnie użyj nowego przeciążenia metody. Na przykład:
typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance) obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji „Dotyczy”.