pInvokeStackImbalance MDApInvokeStackImbalance MDA

DllImportAttribute の属性で指定される呼び出し規約、およびマネージ シグネチャ内のパラメーターの宣言が指定されている場合に、プラットフォーム呼び出しが、予想されるスタックの深さに一致しないことを CLR が検出したときに、pInvokeStackImbalance マネージ デバッグ アシスタント (MDA) がアクティブ化されます。The pInvokeStackImbalance managed debugging assistant (MDA) is activated when the CLR detects that the stack depth after a platform invoke call does not match the expected stack depth, given the calling convention specified in the DllImportAttribute attribute as well as the declaration of the parameters in the managed signature.

注意

pInvokeStackImbalance MDA は 32 ビット x86 プラットフォームに対してのみ実装されています。The pInvokeStackImbalance MDA is implemented only for 32-bit x86 platforms.

注意

.NET Framework version 3.5 で、 pInvokeStackImbalance MDA は既定で無効になります。In the .NET Framework version 3.5, the pInvokeStackImbalance MDA is disabled by default. .NET Framework version 3.5 と Visual Studio 2005 を使用すると、pInvokeStackImbalance MDA が [例外] ダイアログ ボックス ([デバッグ] メニューの [例外] をクリックすると表示される) の [マネージ デバッグ アシスタント] の一覧に表示されます。When you use the .NET Framework version 3.5 with Visual Studio 2005, the pInvokeStackImbalance MDA will appear in the Managed Debugging Assistants list in the Exceptions dialog box (which is displayed when you click Exceptions on the Debug menu). ただし、pInvokeStackImbalance[スローされるとき] のチェック ボックスをオンまたはオフにしても、MDA は有効または無効になりません。MDA がアクティブ化されたときに Visual Studio が例外をスローするかどうかのみを制御します。However, selecting or clearing the Thrown check box for pInvokeStackImbalance does not enable or disable the MDA; it only controls whether Visual Studio throws an exception when the MDA is activated.

現象Symptoms

プラットフォーム呼び出しの実行時または実行後に、アプリケーションでアクセス違反またはメモリ破損が発生します。An application encounters an access violation or memory corruption when making or following a platform invoke call.

原因Cause

プラットフォーム呼び出しのマネージ シグネチャが、呼び出されているメソッドのアンマネージ シグネチャと一致しない可能性があります。The managed signature of the platform invoke call might not match the unmanaged signature of the method being called. この不一致は、正しい数のパラメーターを宣言しないか、適切なサイズのパラメーターを指定しないマネージ シグネチャで発生する可能性があります。This mismatch can be caused by the managed signature not declaring the correct number of parameters or not specifying the appropriate size for the parameters. また、DllImportAttribute 属性によって指定されている可能性がある呼び出し規約が、アンマネージ呼び出し規約と一致しない場合にも、MDA がアクティブ化される可能性があります。The MDA can also activate because the calling convention, possibly specified by the DllImportAttribute attribute, does not match the unmanaged calling convention.

解像度Resolution

マネージ プラットフォーム呼び出しシグネチャ、および呼び出し規則を確認して、ネイティブ ターゲットのシグネチャと呼び出し規約に一致することを確認します。Review the managed platform invoke signature and calling convention to confirm it matches the signature and calling convention of the native target. マネージ側とアンマネージ側の両方で、呼び出し規約を明示的に指定してください。Try explicitly specifying the calling convention on both the managed and unmanaged sides. また、あまり可能性はありませんが、アンマネージ コンパイラのバグなど、何らかの理由によりアンマネージ関数でスタックの不均衡が発生している場合もあります。It is also possible, although not as likely, that the unmanaged function unbalanced the stack for some other reason, such as a bug in the unmanaged compiler.

ランタイムへの影響Effect on the Runtime

すべてのプラットフォーム呼び出しが、CLR の最適化されていないパスを取得するよう強制します。Forces all platform invoke calls to take the nonoptimized path in the CLR.

出力Output

MDA メッセージが、スタックの不均衡の原因であるプラットフォーム呼び出しメソッド呼び出しの名前を示します。The MDA message gives the name of the platform invoke method call that is causing the stack imbalance. メソッド SampleMethod のプラットフォーム呼び出しのサンプル メッセージは、次のとおりです。A sample message of a platform invoke call on method SampleMethod is:

A call to PInvoke function 'SampleMethod' has unbalanced the stack.   
This is likely because the managed PInvoke signature does not match   
the unmanaged target signature. Check that the calling convention and   
parameters of the PInvoke signature match the target unmanaged signature.  

構成Configuration

<mdaConfig>  
  <assistants>  
    <pInvokeStackImbalance />  
  </assistants>  
</mdaConfig>  

関連項目See Also

MarshalAsAttribute
マネージ デバッグ アシスタントによるエラーの診断Diagnosing Errors with Managed Debugging Assistants
相互運用マーシャリングInterop Marshaling