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リファレンス