如何卸载已加载的程序集
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)