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”.

Powiązane artykuły

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.

Społeczności pomagają zadawać i odpowiadać na pytania, przekazywać opinie i słuchać ekspertów z bogatą wiedzą.