如何卸载已加载的程序集

Posted

技术标签:

【中文标题】如何卸载已加载的程序集【英文标题】:How to unloaded a loaded Assembly 【发布时间】:2015-04-16 07:39:27 【问题描述】:

我正在尝试加载程序集,使用Reflection 获取.dll 中的所有类,然后删除.dll。但是,在尝试删除 .dll 时,我遇到了拒绝访问异常。这不是因为访问权限,因为如果我不先加载 .dll,我可以删除它。

我在MSDN上看过,显然没有办法“卸载”,但我希望可能有另一种方式。

Assembly assembly;
assembly = Assembly.LoadFrom(filepath);

Type[] listOfAllClassInDll = assembly.GetTypes();
List<string> listOfAllClassNamesInDll = new List<string>();

        foreach (Type classInDll in listOfAllClassInDll)
        
           listOfAllClassNamesInDll.Add(classInDll.Name);
        

File.Delete(filepath);

【问题讨论】:

见***.com/questions/225330/…或使用Mono.Cecil @xanatos 似乎我的类中没有一个可以使用 ReflectionOnlyLoadFrom 加载,它们都抛出一个“ReflectionTypeLoadException”。不确定这是否是我可以通过某种方式解决的问题。 一般来说,如果你想卸载它们,你必须将它们加载到另一个 AppDomain 中。加载程序集然后卸载它们不是“好”的。他们可以在加载后做“事情”。出于这个原因,有ReflectionOnlyLoadFrom。我建议你试试Mono.Cecil 【参考方案1】:

实际上你不能直接做到这一点.. 这就是为什么:http://blogs.msdn.com/b/jasonz/archive/2004/05/31/145105.aspx

但是您可以在另一个 AppDomain 中动态加载您的程序集。然后,当您不需要您的程序集时 - 您必须使用已加载的程序集卸载 AppDomain。

例如:https://bookie.io/bmark/readable/9503538d6bab80

【讨论】:

链接答案:(不能再访问了【参考方案2】:

您可以将 Load 与 File.ReadAllBytes 一起使用,而不是使用 LoadFrom/LoadFile。在这里,您不直接使用汇编文件,而是读取它的内容并使用读取的数据。因此,您可以随意重命名/删除文件。

您的代码将如下所示:

Assembly assembly;
assembly = Assembly.Load(File.ReadAllBytes(filepath));

Type[] listOfAllClassInDll = assembly.GetTypes();
List<string> listOfAllClassNamesInDll = new List<string>();

foreach (Type classInDll in listOfAllClassInDll)

   listOfAllClassNamesInDll.Add(classInDll.Name);


File.Delete(filepath);

希望这会有所帮助:)

【讨论】:

以上是关于如何卸载已加载的程序集的主要内容,如果未能解决你的问题,请参考以下文章

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)

C#动态加载dll 时程序集的卸载问题

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序

C# 动态加载/卸载程序集

如何从程序集中加载及卸载插件

vb.net编程,如何使用 appdomain 实现某进程DLL动态加载和卸载?