ホームページ  >  記事  >  バックエンド開発  >  VS2010 で PinvokeStackImbalance 例外を修正する方法は?

VS2010 で PinvokeStackImbalance 例外を修正する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 21:17:29781ブラウズ

How to Fix the PinvokeStackImbalance Exception in VS2010?

VS2010 で PinvokeStackImbalance 例外を修正する

以前 VS2008 ではデフォルトで無効になっていた PinvokeStackImbalance 例外が、VS2010 ではデフォルトで有効になりました。この例外は、DllImport 呼び出しの呼び出し規則が間違っていることを開発者に警告することを目的としています。

問題の定義

ソリューションを VS2008 から VS2010 に移行する場合、DllImport は C DLL を呼び出します。 DLL 自体が変更されていない場合でも、一貫して PinvokeStackImbalance 例外がスローされます。

解決策

この問題は、DllImport 宣言で使用されている間違った呼び出し規約に起因します。デフォルトでは、DllImport は CallingConvention.WinApi を使用します。これは、x86 デスクトップ コードの CallingConvention.StdCall に相当します。ただし、基になる C 関数は __cdecl として宣言されており、これには CallingConvention.Cdecl が必要です。

修正

DllImport 宣言を変更して、正しい呼び出し規約を明示的に指定します。

<code class="csharp">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void FasterFunction(
    [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage, 
    [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage, 
    int inTotalSize, int inWindow, int inLevel);</code>

追加メモ

  • この例外は、マネージド デバッグ アシスタント (MDA) モードでのみ発生します。リリース モードではトリガーされません。
  • 呼び出し規約の詳細については、MSDN リファレンスを参照してください。

以上がVS2010 で PinvokeStackImbalance 例外を修正する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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