Я пытаюсь выяснить, как использовать AppDomains.Почему этот код, который работает на отдельном AppDomain Сбой моего процесса?
Потребности:
У меня есть один веб-приложение процесса, который динамически загружает библиотеку DLL и вызывает его с помощью отражения.
Я хочу, чтобы сбой в загруженной dll не разбивал процесс, в дополнение к созданию разделения между «внешним» кодом и моим базовым кодом.
Так что у меня этот «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();
}
}
Не могли бы вы помочь мне понять, что я делаю неправильно?
Ваш код producesses необработанное исключение, которое будет убивать приложения независимо от AppDomain она отбрасывается. – Jehof
Но не является ли одной из целей AppDomain для решения такого сценария? Например, если я использую стороннюю версию бета-версии плагина, я импортирую в приложение для производственной среды? –
Также, пожалуйста, обратитесь к этому сообщению, которое упоминает его в ответе на комментарии: http://stackoverflow.com/questions/1094478/what-is-a-net-application-domain –