2010-07-27 61 views
0

我已经加载了一个特定的AppDomain,我想从它动态地加载一些类型(小菜一碟吧?)。问题在于AppDomain类的所有CreateInstance方法都将其作为远程对象句柄返回。远程代理有一些限制,我想避免这种情况,例如:必须拥有可序列化的具体类以及通过紧急垃圾回收,除非使用LifeTimeService。.net - 从AppDomain动态加载类型而无需远程代理

我的问题是我怎么能加载一个类型在另一个应用程序域中,而没有它包裹在远程代理?以下是我的代码片段。

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

我不认为你可以这样做。你试图做什么,需要你在一个单独的AppDomain中创建对象? – 2010-07-27 23:07:26

+0

我正在构建一个Windows服务,我希望_bllQueue被托管在与主服务内存空间分离的内存空间中。 – James 2010-07-27 23:10:39

回答

1

你总是需要某种类型的代理应用程序域之间的谈话作为.NET不会让你直接访问对象的内存在另一个应用程序域。另请注意,您的示例中的两个AppDomain都将在相同的Windows进程中运行。

有一个新的远程处理基础设施:RIA Services可能会给你想要的功能。

+0

+ 1个不错的答案。 – James 2010-07-27 23:42:19

0

而不是让你对远程感兴趣的对象,做一个远程“引导程序”,作为远程​​AppDomain的通信渠道,并用它来加载你感兴趣的东西。我正在做这个在一个需要反映任意.NET dll从它们获取类型信息的项目上(我在一个新的AppDomain中执行它,因为当我完成后我想卸载程序集以便文件不锁定) - 远程处理Shim加载程序集,进行反射,收集必要的信息并以可序列化对象的形式将其发送回调用AppDomain。见here

+0

我实际上只希望从磁盘加载的动态具体实例不是序列化或远程的。 – James 2010-07-27 23:44:52

+0

该模式仍然成立。无论您做什么,您都需要通过远程代理与辅助AppDomain进行通信,以便您可以对远程感兴趣的类型进行远程处理,也可以进行远程处理。 – nlawalker 2010-07-28 05:09:04

+0

什么是遥控垫片? – James 2010-07-28 17:16:25