ホームページ  >  記事  >  バックエンド開発  >  Visual Studio 2010 で「pinvokestackimbalance」例外が発生するのはなぜですか?

Visual Studio 2010 で「pinvokestackimbalance」例外が発生するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-03 18:37:30553ブラウズ

Why do I get a

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。