Dotyczy
Windows Vista Service Pack 2 Windows 7 Service Pack 1 Windows Server 2008 Service Pack 2 Windows Server 2008 R2 Service Pack 1 Windows 8 Windows Server 2012 Datacenter Windows Server 2012 Datacenter Windows Server 2012 Essentials Windows Server 2012 Foundation Windows Server 2012 Foundation Windows Server 2012 Standard Windows Server 2012 Standard Windows Server 2012 R2 Datacenter Windows Server 2012 R2 Essentials Windows Server 2012 R2 Foundation Windows Server 2012 R2 Standard Windows 8.1

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.