ホームページ  >  記事  >  バックエンド開発  >  Visual Studio 2010 で C# から C DLL を呼び出すと「PinvokeStackImbalance」エラーが発生するのはなぜですか?

Visual Studio 2010 で C# から C DLL を呼び出すと「PinvokeStackImbalance」エラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 21:42:30583ブラウズ

Why Do I Get

Visual Studio 2010 の PinvokeStackImbalance エラー

質問:

Visual Studio 2010 へのアップグレード時、ユーザーは、C# アプリケーションから C DLL を呼び出すときに永続的な "pinvokestackimbalance" 例外に遭遇します。この例外は、Visual Studio 2008 には存在しませんでした。

回答:

この例外は、マネージド デバッグ アシスタント (MDA) の既定の動作の変更により発生します。 Visual Studio 2010。この問題を解決するには、次の手順を検討してください:

  1. 呼び出し規約を修正します:

    例外の主な原因は次のとおりです。呼び出し規約の設定が正しくありません。 Visual Studio 2010 では、DllImport の既定の呼び出し規則は CallingConvention.WinApi であり、x86 デスクトップ アプリケーションの CallingConvention.StdCall に相当します。ただし、この場合の C DLL は Cdecl 呼び出し規約を想定しています。

    これを修正するには、C# コードの [DllImport] 属性を編集して CallingConvention.Cdecl を明示的に指定します。

    <code class="cs">[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>
  2. PinvokeStackImbalance MDA を無効にする:

    他のデバッグ タスクとの干渉を防ぐために、Visual Studio のデバッグ設定で PinvokeStackImbalance MDA を無効にすることができます。

    • Visual Studio のツールを開く > [オプション] メニュー。
    • [デバッグ] > [デバッグ] に移動します。一般。
    • 「マネージド デバッグ アシスタントを有効にする」オプションのチェックを外します。

追加の考慮事項:

  • PinvokeStackImbalance MDA は、リリース モードではデフォルトで有効になっていないため、リリース用にビルドするときに問題は発生しません。
  • 詳細については、CallingConvention 列挙に関する MSDN ドキュメント (https://docs.microsoft) を参照してください。 .com/en-us/dotnet/framework/unmanaged-api/calling-conventions-for-platform-invoke#the-callingconvention-enumeration).

以上がVisual Studio 2010 で C# から C DLL を呼び出すと「PinvokeStackImbalance」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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