来自 NuGet 包的运行时异常引用类型:“无法加载文件或程序集 'Foo'。该系统找不到指定的文件。'

Runtime exception referencing type from a NuGet package: 'Could not load file or assembly 'Foo'. The system cannot find the file specified.'

背景:

  1. 消费应用程序是使用 .NET Core 3.1 构建的网站。
  2. 使用应用程序引用了使用 .NET Standard 2.0 构建的 NuGet 包。
  3. 消费应用程序引用了最新版本的 NuGet 包,并且构建时没有任何错误或警告。
  4. NuGet 包中的 DLL 在 bin\debug\netcoreapp31\bin\release\netcoreapp31\ 文件夹中可见。
  5. 在 IDE 中,可以使用 NuGet 包中类型的完整 IntelliSense,包括类型、方法和参数的 XML 文档注释。
  6. 在运行时,在第一次引用 NuGet 包中的任何类型时,抛出 FileNotFound 异常,报告无法找到 NuGet 包文件中的 DLL。

我试过的:

  1. 正在验证 .csproj 文件中的 PackageReference 条目是否正确。由于它是一个 .NET Core 应用程序,因此没有干扰程序集绑定的提示路径或程序集绑定重定向。
  2. 正在清除 NuGet 缓存。
  3. 删除并重新添加 NuGet 包。
  4. 强制 NuGet 通过包管理器控制台重新安装包。
  5. 清理并重建解决方案。
  6. 启用 Fusion 日志查看器并梳理日志。这就是事情变得有趣的地方。 日志中没有任何条目表明试图解析或加载程序集,也没有任何条目表明程序集绑定失败。

异常消息

Could not load file or assembly 'OneCall.FeatureFlags, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null'. The system cannot find the file specified.
   at PTWebAPI.Startup.ConfigureServices(IServiceCollection services) in C:\Dev\PTWebAPI\PTWebAPI\Startup.cs:line 65
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(Object instance, IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass9_0.<Invoke>g__Startup|0(IServiceCollection serviceCollection)
   at Microsoft.AspNetCore.Hosting.StartupLoader.ConfigureServicesDelegateBuilder`1.<>c__DisplayClass15_0.<BuildStartupServicesFilterPipeline>g__RunPipeline|0(IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.Invoke(Object instance, IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.<>c__DisplayClass8_0.<Build>b__0(IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.StartupLoader.ConfigureServicesDelegateBuilder`1.<>c__DisplayClass14_0.<ConfigureServices>g__ConfigureServicesWithContainerConfiguration|0(IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.ConfigureServices(IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.WebHost.EnsureApplicationServices()
   at Microsoft.AspNetCore.Hosting.WebHost.Initialize()
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at PTWebAPI.Program.Main(String[] args) in C:\Dev\PTWebAPI\PTWebAPI\Program.cs:line 15

失败点

public static void Main(string[] args)
{
   CreateWebHostBuilder(args).Build().Run(); // <-- Right here
}

问题

在 .NET Core 应用程序中加载程序集时导致此特定异常的原因是什么,您如何解决它?

原来是 NuGet 包本身的文化问题。

NuGet 包的文化设置为“en-US”,而消费程序集的文化设置为中性 (“”)。这会阻止使用程序集在运行时加载 NuGet 包的程序集。

解决方案是将 NuGet 包的区域性设置为中性 (""),重新发布包,并更新使用程序集中的包引用。

(感谢 Hamlet Hakobyan 为我指明了正确的方向。)