1

私は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に変更しようとしましたが、どちらも機能しませんでした。

4

1 に答える 1

0

問題は、C++ の char[] である struct メンバーがそのサイズを変更したことでした。C# コードには、この属性がありました

[MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=11)]

そのため、SizeConst プロパティの値を変更する必要がありました。構造体の違いを最初に確認したときに、なぜこれを見なかったのかわかりません...

また、呼び出し規約の問題を修正したところ、すべてが正常に機能するようになりました。

于 2013-01-18T15:10:11.197 に答える