如何卸载已加载的程序集

How to unloaded a loaded Assembly

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

我查看了 MSDN,显然没有办法 "unload",但我希望可能有其他方法。

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

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

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

那里的例子:https://bookie.io/bmark/readable/9503538d6bab80

您可以使用 File.ReadAllBytes 加载,而不是使用 LoadFrom/LoadFile。这里你不直接使用汇编文件,而是读取它的内容并使用读取的数据。所以,你可以随意 rename/delete 文件。

您的代码将如下所示:

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

希望对您有所帮助:)