Отправить сообщение на оригинальный домен приложения - PullRequest
2 голосов
/ 23 декабря 2010

У меня есть приложение, которое создает новый домен приложения, например:

private static AppDomain domain = null;

private static void LoadAndLaunchAppDomain(string assemblyFile, string typeName)
{
    AppDomainSetup setup = new AppDomainSetup()
    {
        ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
        ShadowCopyFiles = "true"
    };

    domain = AppDomain.CreateDomain("ClientKernel", null, setup);
    domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException);
    ClientKernelLauncher launcher = (ClientKernelLauncher)domain.CreateInstanceFromAndUnwrap(assemblyFile, typeName);
    launcher.Launch();
}

static void domain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // handler
}

В какой-то момент выдается исключение, и поток достигает внутри HANDLER.То, что я на самом деле хочу, это воссоздать домен, когда это произойдет.Я заметил, что обработчик фактически работает в домене приложения «ClientKernel», а не в исходном домене, который его создал.

Как связаться с исходным доменом и попросить его снова вызвать LoadAndLaunchAppDomain()метод?

Ответы [ 2 ]

3 голосов
/ 23 декабря 2010

Используйте AppDomain.DoCallBack() для вызова метода другого AppDomain.

Я не уверен, сработает ли это, если в вызове AppDomain возникнет необработанное исключение.Но вы могли бы дать ему шанс.

1 голос
/ 23 декабря 2010

Хотелось бы что-нибудь подобное?

AppDomain hostDomain = AppDomain.CurrentDomain;
domain = AppDomain.CreateDomain("ClientKernel", null, setup);
domain.UnhandledException += (s, e) => {
   hostDomain.DoCallBack(() => { SomeStaticClass.LoadAndLaunchAppDomain("someAssembly", "someClassName"); }
}

Я не знаю, как называется ваш класс, на котором размещен код, поэтому вам придется изменить SomeStaticClass на правильное имя класса.

...