C# 调用dll方法时发生FatalExecutionEngineerError
在我的程序中的这一行:C# 调用dll方法时发生FatalExecutionEngineerError,c#,.net,C#,.net,在我的程序中的这一行: int value = MTEConnect(auth_string, err); 我收到这样的豁免: 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
int value = MTEConnect(auth_string, err);
我收到这样的豁免:
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:我可以在另一台机器上重现相同的问题,但我得到了一条更详细的消息:
Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:\blahblah\MBClient\bin\Debug\MBClient.vshost.exe
库本身是功能性的,因为它可以从其他应用程序中使用,我不能从c#中使用它。
fatalexecutionenignererror
通常是核心CLR本机代码中的损坏导致的致命本机异常。当它发生在PInvoke
呼叫的位置时,这是一个很大的指标PInvoke
签名不正确
您能否提供本机签名,以便我们能够帮助诊断此问题?我已经解决了我的问题!
代码不是这样工作的:
StringBuilder err = new StringBuilder();
int value = MTEConnect(auth_string, err);
StringBuilder err = new StringBuilder(100);
int value = MTEConnect(auth_string, err);
但它确实是这样工作的:
StringBuilder err = new StringBuilder();
int value = MTEConnect(auth_string, err);
StringBuilder err = new StringBuilder(100);
int value = MTEConnect(auth_string, err);
缓冲区似乎太短。我不知道什么是本机签名,在哪里可以得到它?如果有帮助的话,也许我可以共享我正在使用的dll?如果这很重要,那么我有两个相同dll的版本。它们应该是“兼容的”,即应该可以相互替换。但是,当我的代码与一个dll一起工作时,它与另一个dll不工作(没有对代码进行任何更改),我将不工作的dll放在这里(如果您愿意,我也可以通过电子邮件发送给您:)@javapowered您有定义函数MTEConnect的头文件吗?我现在没有这个特定库的.h文件,但我非常确定该函数必须像“int32 WINAPI MTEConnect(char*Params,char*ErrorMsg);”那样声明。明天我将向库的开发人员索取*.h文件。。。也许有可能以某种方式从*dll文件中提取您请求的信息?…我也是:)花了一周时间解决了这个难题:)+1为我节省了一天时间,因为我使用StringBuilder获取Win32 Spooler dll的默认打印机(winspool.drv)