2013-01-14 30 views
1

我是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,但這也不起作用。

+0

您的C++代碼正在破壞GC堆。有很多機會通過* data *參數來做到這一點。召喚大會神祕肯定也不是好兆頭。 –

+0

是的,我已經在想這個了。我最初的懷疑是,由於C++代碼的變化,結構不同步,但到目前爲止我找不到任何區別。我目前的問題是,C++代碼本身工作正常,但是當我調試我的C#應用​​程序時,我立即在調用方法時遇到此問題。我不知道如何找出究竟發生了什麼問題...... – sigy

回答

0

問題是,在C++中是一個char []的struct成員改變了它的大小。在C#代碼中有這個屬性

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

所以我不得不改變SizeConst屬性的值。不知道爲什麼我沒有看到這個時,我第一次檢查結構的差異...

我也修復了調用約定的問題,現在一切似乎工作正常。