在C#中使用AppDomain动态加载和卸载dll

时间:2011-07-05 05:14:09

标签: c#

在我的一个与系统诊断相关的应用程序中,相关的DLL将在C#中动态加载和卸载。经过一些搜索后,我发现一个单独的DLL无法动态加载其完整的AppDomain。所以我必须创建一个AppDomain并使用该DLL动态卸载。但我找不到任何地方我如何在代码中使用它。我无法显示应用程序代码,因为它符合公司规则。

有人可以告诉我一些使用它的应用程序代码。我想使用appdomain动态加载和卸载dll并调用该dll中的特定方法,dll没有任何入口点。

感谢您的回答。 Ashutosh说

4 个答案:

答案 0 :(得分:13)

How to: Load Assemblies into an Application Domain

public static void Main()


    {
        // Use the file name to load the assembly into the current
        // application domain.
        Assembly a = Assembly.Load("example");
        // Get the type to use.
        Type myType = a.GetType("Example");
        // Get the method to call.
        MethodInfo myMethod = myType.GetMethod("MethodA");
        // Create an instance.
        object obj = Activator.CreateInstance(myType);
        // Execute the method.
        myMethod.Invoke(obj, null);
    }

至于如何卸载它,您必须卸载AppDomain本身,请参阅this

AppDomain Temporary = AppDomain.CreateDomain("Temporary");
try
{
  Gateway Proxy = 
    (Gateway) Temporary.CreateInstanceAndUnwrap("Shim", "Shim.Gateway");

  Match M = Proxy.LoadAndMatch("Plugin.dll", 
    "Though the tough cough and hiccough, plough them through");  
}
finally
{
  AppDomain.Unload(Temporary);
}

答案 1 :(得分:1)

很难理解你的问题,但我会尝试提出一些建议。

没有理由不能动态地将dll直接加载到具有单独App Domain的应用程序中,诀窍在于您无法卸载它。这只有在您可以加载同一dll的多个版本时才是重要的(即您希望能够在不停止执行应用程序的情况下将此诊断组件更新为新版本)。如果这是你想要做的,那么我建议this CodeProject article

答案 2 :(得分:1)

实际上,您可以将程序集动态加载到您的应用程序域并从中运行代码,问题是您无法卸载程序集。但是,您可以将其他应用程序域(和程序集)加载到其中,并在完成后卸载应用程序域。

正如它的名字所暗示的那样,你有一个新的应用程序域,你不能只是简单地调用它的代码并使用你需要的类型来整理域边界的调用和数据。如果你搜索,你会发现很多关于如何做的例子。

需要考虑的是,这是一个常见的模式,并且有现成的解决方案,框架本身有一个完整的插件命名空间,专门用于这种类型的插件行为,它可能值得你而在仔细研究那个。有一篇文章here展示了如何使用它。

答案 3 :(得分:0)

谢谢大家,这里是我找到答案的链接:

The MSDN forum description for load and unload of assemblies dynamically

另一个dll可以使用另一个类来动态加载和卸载,这个类会加载程序集并调用该程序集中的方法... AppDomain.CreateInstanceAndUnwrap通常希望输入作为当前项目或通常当前命名空间的程序集。解决我需要Assembly.LoadFrom();在其他类中使用并创建AppDomain并使用链接中给出的AppDomain对象创建此类的实例。

感谢你们的回复。