0

我已经加载了一个特定的 AppDomain,我想从中动态加载一些类型(小菜一碟,对吧?)。事情是 AppDomain 类的所有 CreateInstance 方法都将事情作为远程对象句柄返回。远程代理具有我想避免的限制,例如:必须具有可序列化的具体类,以及过度急切的垃圾收集,除非使用 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;
4

2 回答 2

1

您将始终需要某种类型的代理在应用程序域之间进行通信,因为 .NET 不允许您直接访问另一个应用程序域中对象的内存。另请注意,示例中的两个 AppDomain 都将在同一个 Windows 进程中运行。

有一个用于远程处理的新基础架构:RIA 服务,它可能会为您提供所需的功能。

于 2010-07-27T23:27:59.140 回答
0

不要让您感兴趣的对象可远程处理,而是创建一个可远程处理的“引导程序”,作为远程​​ AppDomain 的通信通道,并使用它来加载您感兴趣的内容。我在一个项目中这样做需要反射任意 .NET dll 以从中获取类型信息(我在新的 AppDomain 中执行此操作,因为完成后我想卸载程序集,因此文件不会被锁定) - 远程 shim 加载程序集,进行反射,收集必要的信息并以可序列化对象的形式将其发送回调用 AppDomain。见这里

于 2010-07-27T23:29:00.563 回答