我有一个C#应用程序,它使用CLR来调用C ++代码库中的功能(我无法修改)。
我的C#应用程序初始化C ++内容,然后定期与之交互。
当C ++的东西初始化时,它产生一个线程,然后在应用程序的生命周期内运行。
某些条件超出了我的控制范围,可能导致C ++内容异常 - 这会导致我的应用程序崩溃。我必须强调,崩溃的原因不是由我的应用程序做的任何事情**。
我已经尝试了AppDomain.CurrentDomain.UnhandledException路由,但它没有捕获异常。
有什么想法吗?
**简而言之,C ++的东西会激活Direct3D - 如果设备丢失,则会引发异常。有几件事可能导致这种情况,但一个很好的例子就是用户锁定了他们的PC(Windows)。
答案 0 :(得分:-2)
您应该在不同的AppDomain中执行外部代码,因此如果外部代码失败,您的应用程序将继续运行,尽管其他域已终止。
public static class NewAppDomain
{
public static void Execute(Action action)
{
AppDomain domain = null;
try
{
domain = AppDomain.CreateDomain("New App Domain: " + Guid.NewGuid());
var domainDelegate = (AppDomainDelegate)domain.CreateInstanceAndUnwrap(
typeof(AppDomainDelegate).Assembly.FullName,
typeof(AppDomainDelegate).FullName);
domainDelegate.Execute(action);
}
finally
{
if (domain != null)
AppDomain.Unload(domain);
}
}
private class AppDomainDelegate : MarshalByRefObject
{
public void Execute(Action action)
{
action();
}
}
}
然后,您可以使用此类
在新的AppDomain中执行外部代码NewAppDomain.Execute(() =>
{
//Here call external code
Console.WriteLine("Hello World");
});
更多信息:https://malvinly.com/2012/04/08/executing-code-in-a-new-application-domain/