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でした)に合わせます。
後はビルドして、エラーが発生しないか確認します。