適用先
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

現象

Microsoft.NET Framework 4.5.1 または Microsoft.NET Framework 4.5.2、およびコードを動的にターゲットとするコードを連結すると、 System.Runtime.InteropServices.Marshal.SizeOfメソッドまたはSystem.Runtime.InteropServices.Marshal.PtrToStructureメソッドを呼び出す方法 (たとえば、Windows PowerShell、IronPython、IronRuby、またはその他の動的言語でスクリプトを使用して)、次の問題が発生する可能性があります。注 マネージ実行可能ファイルにはコンパイル済みのコードでは、そのコードでは、 dynamicキーワードを使用して、C# の場合を除き、これらの問題は発生しません。

問題 1

System.Runtime.InteropServices.Marshal.SizeOfへの呼び出しは、次のMethodInvocationException例外をスローします。

型 ' <タイプ名> は、アンマネージ構造体としてマーシャ リングできません。有効なサイズやオフセットの計算ができません。

問題 2

System.Runtime.InteropServices.Marshal.PtrToStructureへの呼び出しは、次のMethodInvocationException例外をスローします。

指定の構造は blittable かレイアウト情報が必要です。

問題 3

System.Runtime.InteropServices.Marshal.PtrToStructureへの呼び出しは、次のRuntimeBinderException例外をスローします。

'Object' には ' void' 型に暗黙的に変換できません。

原因

エンジンのスクリプトを作成するためにこの問題が発生して、動的言語を.NET Framework で導入される新たなオーバー ロードにバインド可能性があります。具体的には、以前Marshal.SizeOf(Type)を使用することがありますようになりましたを呼び出すMarshal.SizeOf < T > (T)、および、 Marshal.PtrToStructure (IntPtr、種類)を使用する呼び出しを呼び出すことがありますようになりましたMarshal.PtrToStructure < T >(IntPtr, T)。メソッドまたは例外をスローするランタイム バインダー、この変更が原因です。

回避策

この問題を回避するには、お使いの言語を使用すると、この操作を行う場合は、適切なオーバー ロードを使用するようコードを変更します。特定のメソッドのオーバー ロードを指定することはできない場合、を使用するようメソッドの新しいオーバー ロード正しく代わりにコードを変更します。

C# の動的な呼び出しのため

System.TypeにSizeOfのメソッドまたはPtrToStructureのメソッドへの呼び出し内でのキャストを追加します。次に例を示します。

object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);

注 動的なメソッドへの引数のいずれかの場合のみ必要です。

Windows PowerShell スクリプトの

System.TypeにSizeOfのメソッドまたはPtrToStructureのメソッドへの呼び出し内でのキャストを追加します。次に例を示します。

$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)

IronPython スクリプト

型の型の新しいインスタンスを作成し、新しいメソッドのオーバー ロードを使用しています。次に例を示します。

typeInstance = type()size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

状況

マイクロソフトは、この問題を「対象製品」セクションに記載されているマイクロソフト製品の問題として認識しています。

関連情報

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。