首页 > 解决方案 > 手动加载程序集时主线程不退出

问题描述

我们正在通过AppDomain.AssemblyResolve事件加载程序集。这多年来一直没有问题。

从最近我们的应用程序在关闭 UI 后不会退出。

该问题与自定义程序集加载有关,并且可以使用由两个项目(程序集)组成的简单命令行应用程序来重现:

主项目引用该MyLibrary项目,并且该引用的Copy Local属性设置为False,因此程序集 dll 不会复制到执行文件夹,而是通过 AssemblyResolve 加载。

主项目的代码如下所示:

using MyLibrary;
using System;
using System.IO;
using System.Reflection;

namespace ProcessTest
{
    static Program()
    {
        AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
    }

    static void Main(string[] args)
    {
        Console.WriteLine("Begin");

        // call method in other assembly "MyAssembly"
        HelperClass.DoSomething();

        Console.WriteLine("End");
    }


    private static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
    {
        // we only handle resolves of MyLibrary.dll
        if (!args.Name.Contains("MyLibrary"))
            return null;

        // load the assembly manually from its own project folder
#if DEBUG
        var filename = @"..\..\..\MyLibrary\bin\Debug\MyLibrary.dll";
#else
        var filename = @"..\..\..\MyLibrary\bin\Release\MyLibrary.dll";
#endif
           
        using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            var block = new byte[fs.Length];
            fs.Read(block, 0, block.Length);
            var assembly = Assembly.Load(block);
            return assembly;
        }
    }
}

项目HelperClass中的MyLibrary样子是这样的:

using System;

namespace MyLibrary
{
    public class HelperClass
    {
        public static void DoSomething()
        {
            Console.WriteLine("Method in HelperClass");
        }
    }
}

我希望该应用程序能够运行,打印其输出然后退出。在大多数情况下,它不会退出。

该应用程序面向 .NET Framework 4.8。

我们多年来一直在使用该AssemblyResolve模式,并且应用程序始终正常退出。直到最近我们才遇到这种“不退出”的行为。

Windows 或 .NET Framework 中一定有一些变化导致了这种行为变化。

任何提示或帮助将不胜感激。

标签: c#.net

解决方案


我们找到了问题的原因。

事实证明,这与安装在受影响系统上的病毒扫描程序有关。


推荐阅读