You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NUnit TestEngine探查程序集时遇加载类型失败问题求助

解决NUnit TestEngine加载.NET6 WebAPI测试程序集的依赖缺失问题

核心原因先搞清楚

Microsoft.AspNetCore.Hosting.Abstractions在.NET6里已经被整合进Microsoft.AspNetCore.App共享框架了,不再是独立的NuGet包——你查到的2.2.0是.NET Core 2.x时代的老版本,和.NET6完全不是一回事。报错里要的6.0.0版本,其实是共享框架自带的组件,根本找不到对应的NuGet包。

直接上解决办法

1. 让工具和测试项目用同版本.NET

如果你的工具是基于.NET Framework或者低版本.NET Core写的,肯定找不到.NET6共享框架里的东西。把工具的目标框架改成.NET6(或更高兼容版本),运行时就能自动从共享框架加载ASP.NET Core相关组件。

2. 给TestPackage加运行时配置

创建TestPackage的时候,显式指定目标运行时,帮NUnit TestEngine找对依赖:

var package = new TestPackage(testAssembly.Location);
// 明确指定运行时为net6.0
package.AddSetting("RuntimeFramework", "net6.0");

3. 确保测试项目输出目录的依赖完整

虽然你已经把WorkDirectory设成了bin文件夹,但ASP.NET Core的共享框架依赖默认不会复制到输出目录。可以这么做:

  • 打开测试项目的.csproj,加上这个设置:
    <PropertyGroup>
      <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
    </PropertyGroup>
    
  • 清理测试项目,重新生成,确保输出目录里所有该有的依赖都在。

4. 手动处理程序集加载

NUnit的LoadTests会加载测试程序集的所有依赖,包括反射引用的类型。可以在工具启动时加个程序集解析钩子:

// 初始化TestEngine之前就加上这个逻辑
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    var assemblyName = new AssemblyName(args.Name);
    if (assemblyName.Name.StartsWith("Microsoft.AspNetCore."))
    {
        // 从.NET6共享框架目录里找
        var runtimeDir = RuntimeEnvironment.GetRuntimeDirectory();
        var assemblyPath = Path.Combine(runtimeDir, $"{assemblyName.Name}.dll");
        if (File.Exists(assemblyPath))
        {
            return Assembly.LoadFrom(assemblyPath);
        }
    }
    return null;
};

5. 对比两个相似项目找差异

既然有个项目能正常跑,把它和出问题的项目对比一下:

  • 看.csproj里的TargetFramework、PackageReference、RuntimeIdentifier这些设置有没有不同
  • 检查两个项目的bin目录文件列表,看依赖文件有没有差异
  • 看看正常的项目里有没有自定义的程序集加载逻辑,或者特殊的类型引用

为啥VS里能正常运行?

VS测试运行器会自动适配目标测试项目的运行环境,包括自动加载共享框架的依赖,而你自己写的工具得手动配置这些环境参数,这就是核心区别。

内容的提问来源于stack exchange,提问作者Julien N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:15:38