Загрузка сервисов из других .dll и запуск их изолированно - PullRequest
3 голосов
/ 21 марта 2011

Я бы хотел запускать несколько сервисов из разных .dll изолированным способом. В основном все сервисы получены из RoleEntryPoint, и я хочу загрузить каждый из них в отдельном AppDomain и запустить его там в другом потоке.

Пока что я могу найти сервис и получить его тип:

        String pathToDll = @"C:\....\bin\Debug\ChildWorkerRole.dll"; 
        Assembly assembly = Assembly.LoadFrom(pathToDll);
        Type serviceType = assembly.GetTypes().SingleOrDefault(t => t.BaseType == typeof(RoleEntryPoint));

А также запустить его в текущих AppDomain и Thread:

        RoleEntryPoint myRole2 = (RoleEntryPoint)Activator.CreateInstance(serviceType);
        if (myRole2.OnStart())
            myRole2.Run();

Но когда я пытаюсь запустить его в отдельном домене приложения, я получаю исключение:

        AppDomain domain = AppDomain.CreateDomain("MyNewDomain");
        RoleEntryPoint myRole = (RoleEntryPoint)domain.CreateInstanceFromAndUnwrap(pathToDll, serviceType.FullName);
        if (myRole.OnStart())
            myRole.Run();

Это исключение:

System.Runtime.Serialization.SerializationException was unhandled
  Message=Type 'ChildWorkerRole.WorkerRole' in assembly 'ChildWorkerRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
  Source=mscorlib
  StackTrace:
       at System.AppDomain.CreateInstanceFromAndUnwrap(String assemblyName, String typeName)
.......

Самое смешное, что ChildWorkerRole на самом деле отмечен SerializableAttribute ... но может быть потому, что RoleEntryPoint нет, это невозможно сделать.

Любая идея или обходной путь?

спасибо!

1 Ответ

6 голосов
/ 21 марта 2011

Для работы с типом в отдельном домене приложений его и все типы, которые вы непосредственно используете, нужно либо пометить как [Serializable], либо вам нужно извлечь их из MarshalByRefObject .

Если это невозможно, единственный реальный вариант - создать прокси-класс, который вы можете использовать, который соответствует приведенным выше критериям, и позволить ему управлять вашими типами внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...