PinvokeStackImbalance 例外: Visual Studio 2010 の理解と解決策
Visual Studio 2010 では、C DLL への特定の呼び出しによって「pinvokestackimbalance」が発生する場合があります。 " 例外。この例外は、Visual Studio 2008 ではデフォルトで無効になっていましたが、Visual Studio 2010 ではデフォルトで有効になっています。
例外の原因
「pinvokestackimbalance」例外は、実際には例外ですが、マネージド デバッグ アシスタント (MDA) です。プラットフォーム呼び出し (P/Invoke) を使用するときに、マネージド コードとアンマネージド コード間の呼び出し規約の不一致が検出されます。
不正な呼び出し規約
提供されたコード例では、 C# コードは、デフォルトの CallingConvention.WinApi で [DllImport] 属性を使用します。これは、x86 デスクトップ コードの CallingConvention.StdCall に相当します。ただし、C コードでは __cdecl 呼び出し規則が使用されます。
解決
この問題を解決するには、[DllImport] 属性の CallingConvention 属性を明示的に CallingConvention に設定する必要があります。 .Cdecl は、C コードで使用される呼び出し規則と一致します。更新されたコードは次のようになります。
<code class="csharp">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)] static extern void FasterFunction( [MarshalAs(UnmanagedType.LPArray)] ushort[] inImage, [MarshalAs(UnmanagedType.LPArray)] byte[] outImage, int inTotalSize, int inWindow, int inLevel);</code>
追加メモ
「pinvokestackimbalance」MDA はデバッグ モードでのみアクティブになります。リリース モードでは、例外はトリガーされません。したがって、問題がデバッグ モードでのみ発生している場合は、CallingConvention 属性を正しく設定すると問題が解決されるはずです。
以上がVisual Studio 2010 で「pinvokestackimbalance」例外が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。