我是C++開發人員,所以我沒有太多的C#經驗,但是,我必須解決這個問題。只有在調試時System.ExecutionEngineException
有一個C#GUI使用一些C++ DLL。從其中一個DLL調用某個方法時,會發生System.ExecutionEngineException。顯然,我不能進入C++代碼,看看這段代碼是否有問題。所以我建立了一個小型的C++測試應用程序,並且這個工作正常。在C#代碼中調用該方法的參數對我來說也很好(在我的C++測試應用程序中使用了相同的值)。儘管在GUI中可能存在或可能不存在與此問題相關的問題,但在沒有Visual Studio的情況下啓動相同的可執行文件就很好。
我目前不知道如何找出導致問題的原因。任何提示將不勝感激。
調用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,但這也不起作用。
您的C++代碼正在破壞GC堆。有很多機會通過* data *參數來做到這一點。召喚大會神祕肯定也不是好兆頭。 –
是的,我已經在想這個了。我最初的懷疑是,由於C++代碼的變化,結構不同步,但到目前爲止我找不到任何區別。我目前的問題是,C++代碼本身工作正常,但是當我調試我的C#應用程序時,我立即在調用方法時遇到此問題。我不知道如何找出究竟發生了什麼問題...... – sigy