C#:为什么我的应用程序不关闭其文件句柄?

标签 c# reflection assemblies

我有一个应用程序在文件系统和 GAC 中打开一系列 DLL,并且锁定了这些文件。如何显式释放这些句柄,以便在不关闭我的应用程序的情况下在 Visual Studio 中重建它们?

代码如下:

private void BuildTabPage_AssemblyTree(string filename, string foldername)
{
    Assembly assembly;
    try
    {
    assembly = Assembly.LoadFrom(filename);
    }
    catch (Exception ex) 
    {
    MessageBox.Show("Error loading assembly " + filename + "\n" + ex.Message);
    return;
    }
    TreeNode tRoot = BuildNode(assembly, foldername);
    tvAssemblies.Nodes.Add(tRoot);
    tvAssemblies.ExpandAll();

    txtResults.Text =
    RefsFound.ToString() + " References Located in Filesystem\r\n" +
    RefsInFramework.ToString() + " References Located in Framework\r\n" +
    RefsInGac.ToString() + " References Located in GAC\r\n" +
    RefsNotFound.ToString() + " References Not Found: \r\n\r\n";
    foreach (string s in MissingFiles)
    txtResults.Text += s + "\r\n";
}

private TreeNode BuildNode(Assembly assembly, string foldername)
{
    TreeNode tn = new TreeNode(assembly.GetName().Name);
    tn.ToolTipText = assembly.FullName + "\n" + assembly.CodeBase;
    AssemblyName[] assemblies = assembly.GetReferencedAssemblies();

    foreach (AssemblyName a in assemblies)
    {
    string filename2 = foldername + a.Name + ".dll";
    TreeNode tn2;
    if (System.IO.File.Exists(filename2))
    { // File found in folder
        RefsFound++;
        Assembly assy = Assembly.LoadFile(filename2);
        tn2 = BuildNode(assy, foldername);
    }
    else if (a.Name.StartsWith("System"))
    { // Framework assemblies not included
        RefsInFramework++;
        tn2 = new TreeNode();
        tn2.Text = a.Name;
        tn2.ForeColor = System.Drawing.Color.Green;
        tn2.ToolTipText += "\n.NET Framework File";
    }
    else
    {
        try
        {   // Find file in GAC
        Assembly assy = Assembly.Load(a);
        tn2 = new TreeNode(a.Name);
        tn.ToolTipText = assembly.FullName + "\n" + assembly.CodeBase + "\nFile detected in GAC";
        tn2.Text = "(" + filename2.Substring(filename2.LastIndexOf("\\") + 1) + ")";
        tn2.ForeColor = System.Drawing.Color.Green;
        RefsInGac++;
        }
        catch (System.IO.FileNotFoundException)
        {   // File not Found
        RefsNotFound++;
        if (!MissingFiles.Contains(a.Name))
            MissingFiles.Add(a.Name);
        tn2 = new TreeNode();
        tn2.Text = "(" + filename2.Substring(filename2.LastIndexOf("\\") + 1) + ")";
        tn2.ToolTipText = "File Not Found";
        tn2.ForeColor = System.Drawing.Color.Red;
        }
    }
    tn.Nodes.Add(tn2);
    }

    return tn;
}

最佳答案

不幸的是,加载到默认 AppDomain 中的程序集在应用程序退出之前不会被卸载。但是,您可以创建一个 AppDomain 并在创建的 AppDomain 中加载程序集。当创建的AppDomain被卸载时,创建的AppDomain中加载的程序集也会一起被卸载。

关于C#:为什么我的应用程序不关闭其文件句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1250400/

相关文章:

c# - Rebus 和 RabbitMQ - 使用多个独立的 Rebus 实例?

c# - Windows 10 UWP - 如果前台应用程序正在运行,则停止后台任务

c# - 在 C# 中生成 1 MB(或 n MB)文本文件

c# - 从基类中的派生类获取属性

scala - 如何在运行时确定 Scala 类的属性?

kotlin - Kotlin检查数据类属性是否全部为空

c# - 使每个类成为一个单独的程序集

c# - ReferenceEquals(null, obj) 和 null == obj 是一回事吗?

sql - 使用 Visual Studio 2008 部署 SQL 项目时出错

c# - 程序集绑定(bind)和重定向