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