私はC++開発者なので、C#の経験はあまりありませんが、とにかくこの問題を修正する必要があります。
いくつかのC++DLLを使用しているC#GUIがあります。DLLの1つからメソッドの1つを呼び出すと、System.ExecutionEngineExceptionが発生します。明らかに、C ++コードに足を踏み入れて、このコードに問題があるかどうかを確認することはできません。そこで、小さなC ++テストアプリケーションを作成しましたが、これは問題なく機能しました。C#コードでメソッドが呼び出されるパラメーターも、私には問題ないように見えます(C ++テストアプリで同じ値を使用しました)。GUIのどこかに問題があり、この問題に関連している場合と関連していない場合がありますが、VisualStudioなしで起動した同じ実行可能ファイルは問題なく動作します。
私は現在、問題の原因を見つける方法がわかりません。ヒントは大歓迎です。
C#コードのメソッドの呼び出し。caseIDはint型、paramIDはSystem.Int32型、paramDataはカスタム構造体です。
getParameter(caseID, dataID, paramID, ref paramData)
C#コードのメソッドのシグネチャは次のようになります。
[ DllImport ("helper.dll", CallingConvention=CallingConvention.Cdecl/*, CharSet = CharSet.Auto*/ )]
public static extern ERROR getParameter(System.Int32 caseID, System.Int32 dataID, System.Int32 paramID, ref PARAMETER_DATA data);
C++DLLの対応するメソッドのシグネチャは次のようになります。
ERROR _stdcall getParameter(const long caseID, const long dataID, long number, PARAMETER_DATA *data);
私には奇妙に見えるのは、C ++コードは、メソッドが呼び出し規約「stdcall」で呼び出されるべきであると明示的に述べているのに対し、C#コードはCdeclを使用したいということです。ただし、このコードはかなり前から機能しているようです。また、両方の呼び出し規約をstdcallに変更しようとしましたが、どちらも機能しませんでした。