c# - 手动加载程序集时主线程不退出
问题描述
我们正在通过AppDomain.AssemblyResolve
事件加载程序集。这多年来一直没有问题。
从最近我们的应用程序在关闭 UI 后不会退出。
该问题与自定义程序集加载有关,并且可以使用由两个项目(程序集)组成的简单命令行应用程序来重现:
- ProcessTest - 主程序集,生成命令行 exe
- MyLibrary - 一个带有 1 个方法 (
HelperClasse.DoSomething
)的静态类的库项目
主项目引用该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");
}
}
}
我希望该应用程序能够运行,打印其输出然后退出。在大多数情况下,它不会退出。
当引用的程序集复制到执行文件夹时,应用程序正常退出。然后程序集由默认机制加载,而不是通过
AssemblyResolve
.在某些情况下,应用程序会正常退出,例如在 Windows 沙盒中运行时
该应用程序面向 .NET Framework 4.8。
我们多年来一直在使用该AssemblyResolve
模式,并且应用程序始终正常退出。直到最近我们才遇到这种“不退出”的行为。
Windows 或 .NET Framework 中一定有一些变化导致了这种行为变化。
任何提示或帮助将不胜感激。
解决方案
我们找到了问题的原因。
事实证明,这与安装在受影响系统上的病毒扫描程序有关。
推荐阅读
- html - 导航栏上的图像使导航菜单扩展
- php - 需要帮助将数组分配给php的数组元素
- microsoft-graph-api - 问题:Microsoft ToDo 任务的 lastModifiedDateTime 每 5 分钟更新一次,没有进行任何更新
- python - 在 VSCODE 中运行程序后使用 python shell
- android - 错误 E/BeaconTransmitter:由于 Android 5.5.1 和三星 T295 平板电脑出现异常,无法开始广告
- java - 如何强制弹簧只有一个活动配置文件?
- powerbi - Power Automate,将 PowerBI 项目导出到 Excel csv 最大行数 1k
- excel - 如何通过 VBA 更改 Excel 图表中点的颜色
- javascript - TypeError:将 React 表单中的按钮连接到不同 JavaScript 文件中的函数 (MapboxGL)
- c# - 保护托管 API 的 Azure AP 服务