从其他.dll加载服务并将它们隔离运行

vto*_*ola 3 .net c# reflection runtime appdomain

我想以一种孤立的方式运行来自不同.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));
Run Code Online (Sandbox Code Playgroud)

而在目前还运行AppDomainThread:

        RoleEntryPoint myRole2 = (RoleEntryPoint)Activator.CreateInstance(serviceType);
        if (myRole2.OnStart())
            myRole2.Run();
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在不同的AppDomain中单独运行它时,我得到一个例外:

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

这个例外:

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)
.......
Run Code Online (Sandbox Code Playgroud)

有趣的是,ChildWorkerRole它实际上标有SerializableAttribute...但可能是因为RoleEntryPoint不是,它无法完成.

任何想法或解决方法?

谢谢!

Ree*_*sey 6

为了使用单独的AppDomain中的类型,它和您直接使用的所有类型都需要标记为[Serializable],或者需要从MarshalByRefObject派生它们.

如果这是不可能的,唯一真正的选择是创建一个可以使用的代理类,它遵循上述标准,并允许它在内部管理您的类型.