【问题标题】:.Net - Load Type dynamically from AppDomain without remoting proxy.Net - 从 AppDomain 动态加载类型,无需远程代理
【发布时间】:2010-07-27 22:56:51
【问题描述】:

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

我的问题是如何在另一个应用程序域中加载类型而不将其包装在远程代理中?下面是我的代码的 sn-p。

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;

【问题讨论】:

  • 我认为你做不到。您想要做什么需要您在单独的 AppDomain 中创建对象?
  • 我正在构建一个 Windows 服务,我希望将 _bllQueue 托管在与主服务内存空间不同的内存空间中。

标签: .net remoting appdomain dynamic-loading


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我实际上只是希望从磁盘加载未序列化或远程的动态具体实例。
    • 模式仍然成立。无论您做什么,您都需要通过远程代理与您的辅助 AppDomain 进行通信,因此您可以将您感兴趣的类型设为可远程处理,或者制作一个远程处理 shim。
    • 什么是远程垫片?
    • 对不起,我不清楚:垫片是我在原始答案中提到的“引导程序”对象。这是您专门创建的一个类,用于与远程 AppDomain 通信并用于在该 AppDomain 内执行操作。我的观点是,如果您正在使用另一个 AppDomain,您将需要进行远程处理,因此您的选择是使您感兴趣的对象可远程处理,以便您可以直接与它们通信,或者创建一个“垫片”您可用于与其他 AppDomain 进行通信。
    猜你喜欢
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多