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

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

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

谢谢你的回答。 Ashutosh说

如何:将程序集加载到应用程序域中

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本身,看看这个

 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); } 

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

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

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

顾名思义,然后你有一个新的应用程序域,你不能只是简单地调用它的代码并使用你需要的类型来跨域边界调整你的调用和数据。 如果你搜索,你会发现很多关于如何做到这一点的例子。

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

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

用于动态加载和卸载程序集的MSDN论坛描述

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

谢谢你的回复家伙。