【问题标题】: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);

【问题讨论】:

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

标签: c# dll .net-assembly


【解决方案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);

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2011-01-09
    相关资源
    最近更新 更多