处理C#中C ++线程中引发的异常

时间:2017-06-15 08:18:44

标签: c# c++ exception clr

我有一个C#应用程序,它使用CLR来调用C ++代码库中的功能(我无法修改)。

我的C#应用​​程序初始化C ++内容,然后定期与之交互。

当C ++的东西初始化时,它产生一个线程,然后在应用程序的生命周期内运行。

某些条件超出了我的控制范围,可能导致C ++内容异常 - 这会导致我的应用程序崩溃。我必须强调,崩溃的原因不是由我的应用程序做的任何事情**。

我已经尝试了AppDomain.CurrentDomain.UnhandledException路由,但它没有捕获异常。

有什么想法吗?

**简而言之,C ++的东西会激活Direct3D - 如果设备丢失,则会引发异常。有几件事可能导致这种情况,但一个很好的例子就是用户锁定了他们的PC(Windows)。

1 个答案:

答案 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/