我已经加载了一个特定的AppDomain,我想从中动态加载一些类型(小蛋糕吧?)。问题是AppDomain类的所有CreateInstance方法都将事物作为远程处理对象句柄返回。 Remoting代理具有我想避免的限制,例如:必须具有可序列化的具体类,并且除非使用LifeTimeService,否则需要过度垃圾收集。
我的问题是如何在不将其包装在远程代理中的情况下在另一个应用程序域中加载类型?下面是我的代码片段。
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationBase = Path.GetDirectoryName(_bllAssemblyPath);
ads.PrivateBinPath = Path.GetDirectoryName(_bllAssemblyPath);
if (File.Exists(_bllAssemblyPath + ".config"))
ads.ConfigurationFile = _bllAssemblyPath + ".config";
_workerSpace= AppDomain.CreateDomain("worker", new System.Security.Policy.Evidence(AppDomain.CurrentDomain.Evidence), ads );
_bllQueue = _workerSpace.CreateInstanceFrom(_bllAssemblyPath, queueType) as IThumbCapQueue;
答案 0 :(得分:1)
您将始终需要某种类型的代理来在应用程序域之间进行通信,因为.NET不会让您直接访问其他应用程序域中对象的内存。另请注意,示例中的两个AppDomain都将在同一个Windows进程中运行。
有一个新的远程处理基础架构:RIA Services可能会为您提供所需的功能。
答案 1 :(得分:0)
不要让您感兴趣的对象远程处理,而是创建一个远程“引导程序”,作为远程AppDomain的通信通道,并使用它来加载您感兴趣的内容。我正在这样做一个需要反映任意.NET dll以从中获取类型信息的项目(我在新的AppDomain中执行它,因为当我完成时我想卸载程序集以便文件没有被锁定) - 远程处理填充程序加载程序集,反射,收集必要的信息,并以可序列化的对象的形式将其发送回调用的AppDomain。请参阅here。