尝试不会在DllImport函数中捕获异常

时间:2010-02-26 18:58:31

标签: c# c++

我从C#项目调用C ++函数:

[System.Runtime.InteropServices.DllImport("C.dll")]
public static extern int FillSlist(out string slist);

然后

try
{
  FillSlist(out slist);
}
catch
{
}

C ++ dll受第三方工具保护,因此在真正执行FillSlist之前正在执行一些代码。当执行第三方代码并且程序完全停止工作时,会发生一些非常糟糕的事情。 “try”既不会隔离问题,也不会执行“AppDomain.CurrentDomain.UnhandledException”。

有什么能帮助隔离C ++函数与C#调用代码的崩溃吗?

1 个答案:

答案 0 :(得分:15)

这是在CLR 4.0上运行吗?如果是的话......

如果异常未在代码中演示的open catch块中被捕获,那是因为CLR认为它是一个损坏的状态异常,并且默认情况下不由用户代码处理。相反,它会传播并导致进程终止。

这样做是因为这些类型的异常没有动作,托管代码可以采取纠正问题的方法。唯一可行的解​​决方案是终止该过程。

您可以通过向方法添加HandledCorruptedStateException属性来覆盖此行为。但总的来说这是一个坏主意。

更多详情

如果没有,那么程序可能只是在本机代码中崩溃,执行从未正确返回到托管代码。