2011-05-16 117 views
4

在我的計劃在這條線:FatalExecutionEngineError同時調用DLL方法

int value = MTEConnect(auth_string, err); 

我收到這樣exeption:

FatalExecutionEngineError 
The runtime has encountered a fatal error. The address of the 
error was at 0x68c8a681, on thread 0x2334. The error code is 
0xc0000005. This error may be a bug in the CLR or in the unsafe 
or non-verifiable portions of user code. Common sources of this 
bug include user marshaling errors for COM-interop or PInvoke, 
which may corrupt the stack. 

MTEConnect導入這樣的方式:

[DllImport("mtesrl.dll", CharSet = CharSet.Ansi)] 
    private static extern int MTEConnect(String pars, StringBuilder err); 

有什麼問題和如何解決它?

UPD:我可以重現另一臺機器上同樣的問題,但我得到多一點desriptive消息:

Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:\blahblah\MBClient\bin\Debug\MBClient.vshost.exe 

庫本身是功能性的,因爲它可以從其他應用程序中使用,我只是不能使用它從c#

回答

4

我已經解決了我的問題! 規範不以這種方式工作:

StringBuilder err = new StringBuilder(); 
int value = MTEConnect(auth_string, err); 

但它做的工作是這樣的:

StringBuilder err = new StringBuilder(100); 
int value = MTEConnect(auth_string, err); 

看來緩衝區太短。

+0

很高興你知道了! – JaredPar 2011-05-20 15:16:37

+0

我也是:)花了一個星期解決thiz謎題:) – javapowered 2011-05-20 18:53:16

1

A FatalExecutionEnigneError通常是核心CLR本機代碼內的腐敗的結果,導致致命的本機異常。當它發生在PInvoke呼叫的站點時,這是一個很大的指示器,PInvoke簽名是不正確的。

您能否提供本機簽名,以便我們可以幫助診斷此問題?

+0

我不知道什麼是本機簽名,我可以在哪裏得到它?大概我可以分享我使用的dll,如果它會幫助? – javapowered 2011-05-17 05:21:16

+0

如果它很重要,那麼我有2個版本的相同的DLL。他們應該是「兼容的」,即應該可以用一個替代另一個。但是,當我的代碼與一個DLL工作,它不能與另一個工作(沒有任何代碼的變化) – javapowered 2011-05-17 07:53:16

+0

我已經放在這裏不工作的DLL http://zalil.ru/31055951(我也可以發送你通過電子郵件,如果你願意:) – javapowered 2011-05-17 08:00:04