single.php

PInvoke 関数 がスタックを不安定にしていますって

C#からC++で作ったDLL(ダイナミックリンクライブラリ)のエクスポート関数を呼び出す際に、PInvoke関数がエラーになるようになりました。これは.NET Frameworkがバージョンアップした時に追加された仕様のようで、DllImport構文を書き換えることで回避できます。詳しいエラー内容は

PInvoke 関数 ‘○!△::○’ がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。

で例外になります。訳の分からん内容ですが、とにかく「エクスポート関数の呼び出し規約が一致していない」と言う事だと思います。

回避するには、DLLをインポートするDllImport構文に呼び出し規約を追加します。

具体的には

[DllImport(@"XXX.dll")]
private extern static int FuncX(StringBuilder...);

の部分を以下のように修正します。

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

CallingConventionの後ろは呼び出し規格(今回はC++のdeclでした)に合わせます。

後はビルドして、エラーが発生しないか確認します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です