メイン コンテンツへスキップ
サポート
Microsoft アカウントでサインイン
サインインまたはアカウントを作成してください。
こんにちは、
別のアカウントを選択してください。
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

現象

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)

状況

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

関連情報

ヘルプを表示

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

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

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?
[送信] を押すと、Microsoft の製品とサービスの改善にフィードバックが使用されます。 IT 管理者はこのデータを収集できます。 プライバシーに関する声明。

フィードバックをいただき、ありがとうございます。

×