我从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#调用代码的崩溃吗?
答案 0 :(得分:15)
这是在CLR 4.0上运行吗?如果是的话......
如果异常未在代码中演示的open catch块中被捕获,那是因为CLR认为它是一个损坏的状态异常,并且默认情况下不由用户代码处理。相反,它会传播并导致进程终止。
这样做是因为这些类型的异常没有动作,托管代码可以采取纠正问题的方法。唯一可行的解决方案是终止该过程。
您可以通过向方法添加HandledCorruptedStateException
属性来覆盖此行为。但总的来说这是一个坏主意。
更多详情
如果没有,那么程序可能只是在本机代码中崩溃,执行从未正确返回到托管代码。