如何卸载已加载的程序集

时间:2015-04-16 07:39:27

标签: c# dll .net-assembly

我正在尝试加载程序集,使用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);

2 个答案:

答案 0 :(得分:1)

实际上你不能直接做到这一点.. 原因如下:http://blogs.msdn.com/b/jasonz/archive/2004/05/31/145105.aspx

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

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

答案 1 :(得分:0)

您可以使用Load with 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);

希望这会有所帮助:)