【问题标题】:C# - Loading .NET Assembly into Separate AppDomain So You Can Unload It [duplicate]C# - 将.NET程序集加载到单独的AppDomain中,以便您可以卸载它[重复]
【发布时间】:2010-11-16 17:53:53
【问题描述】:

可能重复:
Loading DLLs into a separate AppDomain

将 .NET 程序集加载到单独的 AppDomain 中的正确方法是什么,以便您可以访问其类型/类但仍然能够卸载(并重新加载)。

这是之前讨论的切线: C# - Correct Way to Load Assembly, Find Class and Call Run() Method

【问题讨论】:

    标签: c# .net reflection dynamic assemblies


    【解决方案1】:

    基本上,您只需创建新的 AppDomain,然后调用 AppDomain.CreateInstanceAndUnwrap 来创建类型。这是一个关于这个过程的简单CodeProject article

    这里有一些技巧。您永远不能直接引用类型(这会将类型加载到您当前的 AppDomain 中),并且所有对象都应该派生自 MarshallByRefObj。这将允许您“远程”使用该对象,这意味着阻止它加载到您的 AppDomain 中。

    【讨论】:

    • +1 谢谢。每次跨 AppDomain 时性能损失有多严重?
    • 视情况而定。任何在 appdomains 之间传递的东西基本上都是序列化的。 (它的工作方式与 Remoting 非常相似。)一般来说,如果您的所有类型都派生自 MarshallByRefObj,它们只会序列化一个“句柄”,因此速度非常快。但是,当您读取数据时,数据将被序列化,这可能会减慢速度。尝试始终在第二个应用程序域中保留尽可能多的“内部”,这可能不会成为问题。
    • 还要注意远程实例的生命周期是有限的。根据 .Net 版本,您应该使用 WCF 而不是远程处理。
    • @Guillaume 这如何应用?跨 AppDomain 本质上是通过 Remoting 完成的。
    • msdn.microsoft.com/library/72x4h507.aspx 远程处理已弃用。没有什么能阻止您在两个 AppDomain 之间使用 WCF。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多