【问题标题】:Loading DLLs into a separate AppDomain将 DLL 加载到单独的 AppDomain
【发布时间】:2010-09-10 11:07:45
【问题描述】:

我想动态加载一个或多个 DLL,以便它们以与我的主应用程序不同的安全性或基本路径运行。如何将这些 DLL 加载到单独的 AppDomain 并从中实例化对象?

【问题讨论】:

  • 引用的可能重复的上下文不同。在引用的问题中,目标是调用不是由开发人员创建或控制的 AppDomain 中的代码。这个问题专门关于在开发人员控制的 AppDomain 中加载代码,以便他们可以修改 AppDomain 的特性。此外,引用的问题也没有给出如何在运行时动态加载 DLL 的完整代码示例,这是该问题的关键组成部分。

标签: c# .net appdomain


【解决方案1】:

更具体

AppDomain domain = AppDomain.CreateDomain("New domain name");
//Do other things to the domain like set the security policy

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load
Type t = typeof(TypeIWantToLoad);
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

如果一切正常(没有抛出异常),您现在已将 TypeIWantToLoad 实例加载到新域中。您拥有的实例实际上是一个代理(因为实际对象位于新域中),但您可以像使用普通对象一样使用它。

注意:据我所知,TypeIWantToLoad 必须继承自 MarshalByRefObject。

【讨论】:

    【解决方案2】:

    如前所述,使用 AppDomain.CreateDomain 创建一个新的应用程序域。然后,您可以使用 Load 方法将程序集加载到其中,甚至可以使用 ExecuteAssembly 方法执行程序集。您可以使用 GetAssemblies 查看是否已加载程序集。还要注意,一旦加载了程序集,就无法卸载它。您需要卸载域。

    【讨论】:

      【解决方案3】:

      使用 AppDomain.Create( ... ) 创建一个新的 Appdomain。 创建 AppDomain 后,将 DLL 加载到该 AppDomain。

      查看 Appdomain 使用 Create* 提供的所有方法。有一些东西,比如 CreateInstanceAndUnwrap 等等。

      【讨论】:

        【解决方案4】:

        如果您的目标是 3.5,则可以利用新的 managed extensibility framework 为您处理所有繁重的工作。

        【讨论】:

        • @dboar 好吧,它将成为 4.0 中框架的一部分,但 AFAIK 您可以在 3.5 中使用预览版(下载页面显示他们已经“合并了 .net 3.5 和 silverlight 二进制文件”)。
        • 哦,很酷...我从来没有经过最初的 codeplex 页面,因为他们特别说 .Net 4.0...很高兴知道...谢谢
        【解决方案5】:

        您可以使用AppDomain.CreateInstance 方法来执行此操作。您需要调用返回的 ObjectHandle 的 Unwrap 方法以获取实际对象。

        【讨论】:

        • 如果我要创建其实例的对象在我要加载的程序集中定义怎么办?如果不先实际加载程序集,我不知道这个对象的名称是什么......
        • @liortal 这个问题的公认答案是否符合您的要求?
        • 我们想将一组 DLL 加载到另一个 AppDomain 中,但是我们不知道这些 DLL 中定义的类型。
        • @liortal 您应该能够使用 AppDomain.Load() 将 DLL 加载到该 AppDomain 中。这将返回一个 Assembly 实例,您可以使用它来查询该程序集中的任何类型。
        • 提醒一下,Andy 建议使用 AppDomain.Load() 可能会起作用,但它也会在当前域中加载请求的程序集,这似乎违背了使用不同域的目的.见msdn.microsoft.com/en-us/library/36az8x58(v=vs.110).aspx
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        相关资源
        最近更新 更多