为什么在单独的AppDomain上运行的代码会崩溃我的进程?

时间:2015-08-17 12:29:10

标签: c# .net reflection appdomain

我试图找出如何使用AppDomains。

需要:

我有一个单一的流程Web应用程序,可动态加载dll并使用反射调用它。

我想确保加载的dll中的崩溃不会导致进程崩溃,除了在" external"之间创建分离。代码和我的基本代码。

所以我有这个" isloated"类:

public sealed class Isolated<T> : IDisposable where T : MarshalByRefObject
{
    private AppDomain _domain;
    private T _value;

    public Isolated()
    {
        _domain = AppDomain.CreateDomain("Isolated:" + Guid.NewGuid(),
           null, AppDomain.CurrentDomain.SetupInformation);

        Type type = typeof(T);

        _value = (T)_domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
    }

    public T Value
    {
        get
        {
            return _value;
        }
    }

    public void Dispose()
    {
        if (_domain != null)
        {
            AppDomain.Unload(_domain);

            _domain = null;
        }
    }
}

我在下面编写了这段代码,我的期望是它不会破坏这个过程,但确实如此。

public class Work : MarshalByRefObject
{
    public void DoSomething()
    {
        Thread thread = new Thread(new ThreadStart(() =>
        {
            throw new Exception();
        }));

        thread.IsBackground = true;

        thread.Start();

        while (true)
        {
            System.Diagnostics.Trace.WriteLine("Hello from main thread");
        }
    }
}

    protected void Page_Load(object sender, EventArgs e)
    {
        using (Isolated<Work> isolated = new Isolated<Work>())
        {
            isolated.Value.DoSomething();
        }
    }
你能帮我理解我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

无法阻止进程终止。

正如@Jehof所说,

此处有更多信息:http://www.codeproject.com/Articles/635497/AppDomains-Wont-Protect-Host-From-a-Failing-Plugin