Я бы хотел запускать несколько сервисов из разных .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
нет, это невозможно сделать.
Любая идея или обходной путь?
спасибо!