gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:40:23 25 4
gpt4 key购买 nike

我想以隔离的方式从不同的 .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));

并且还在当前的AppDomainThread中运行它:

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

但是当我尝试在不同的 AppDomain 中单独运行它时,出现异常:

        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 不是,它不能完成。

有什么想法或解决方法吗?

谢谢!

最佳答案

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

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

关于c# - 从其他 .dll 加载服务并隔离运行它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5380246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com