如何卸载已加载的程序集
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。
您可以使用 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);
希望对您有所帮助:)
我正在尝试加载程序集,使用 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。
您可以使用 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);
希望对您有所帮助:)