1. ホーム
  2. c#

[解決済み] pinvokestackimbalance -- どうすればこれを修正できますか、またはどうすればこれをオフにできますか?

2023-07-02 07:46:55

質問

vs2008 から vs2010 に切り替えたところです。 C++ dll へのすべての呼び出しが「pinvokestackimbalance」例外を発生させる以外は、まったく同じ解決策です。

この例外は 2008 では発生しません。 私は、C++ dll と呼び出し側のアプリケーションに完全にアクセスできます。 pinvoke には何の問題もないように見えますが、この問題により、他の問題のデバッグが不可能になっています。

たとえば、ここに C# の署名があります。

    [DllImport("ImageOperations.dll")]
    static extern void FasterFunction(
        [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage, 
        [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage, 
        int inTotalSize, int inWindow, int inLevel);

C++側ではこんな感じです。

#ifdef OPERATIONS_EXPORTS
#define OPERATIONS_API __declspec(dllexport)
#else
#define OPERATIONS_API __declspec(dllimport)
#endif
extern "C" {


OPERATIONS_API void __cdecl FasterFunction(unsigned short* inArray, 
                                       unsigned char* outRemappedImage,
                                       int inTotalSize, 
                                       int inWindow, int inLevel);

}

vs2010 と vs2008 では何が違っていて、これらの例外がスローされるのでしょうか? DllImport ディレクティブに異なるパラメータ セットを追加する必要がありますか?

どのように解決するのですか。

まず、コードが間違っている (そして常にそうであった) ことを理解します。pInvokeStackImbalance" は、それ自体は例外ではありませんが、管理されたデバッグ アシスタントです。VS2008ではデフォルトでオフになっていましたが、多くの人がオンにしなかったので、VS2010ではデフォルトでオンになっています。MDA はリリース モードでは実行されないので、リリース用にビルドしてもトリガーされません。

あなたの場合、呼び出しの規則が正しくありません。 DllImport はデフォルトで CallingConvention.WinApi と同じです。 CallingConvention.StdCall と同じです。これは CallingConvention.Cdecl .

これは、行を編集することで、行うことができます [DllImport("ImageOperations.dll")] にすることです。

[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]

詳しくは このMSDNリファレンス