pinvokestackimbalance -- これを修正またはオフにするにはどうすればいいですか? 質問する

pinvokestackimbalance -- これを修正またはオフにするにはどうすればいいですか? 質問する

vs2008 から vs2010 に切り替えました。まったく同じ解決策ですが、C++ dll へのすべての呼び出しで 'pinvokestackimbalance' 例外が発生します。

この例外は 2008 では発生しません。C++ dll と呼び出しアプリケーションに完全にアクセスできます。pinvoke に問題はないようです。しかし、この問題により他の問題のデバッグが不可能になっています。IDE はこれらのことを通知するために頻繁に停止します。

たとえば、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 ディレクティブに別のパラメータ セットを追加する必要がありますか?

ベストアンサー1

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

あなたの場合、呼び出し規約が正しくありません。DllImportはデフォルトで になりCallingConvention.WinApi、x86 デスクトップ コードの場合と同じですCallingConvention.StdCall。 である必要がありますCallingConvention.Cdecl

これは、次の行を編集することで実行できます[DllImport("ImageOperations.dll")]

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

詳細については、このMSDNリファレンス

おすすめ記事