来自 NuGet 包的运行时异常引用类型:“无法加载文件或程序集 'Foo'。该系统找不到指定的文件。'
Runtime exception referencing type from a NuGet package: 'Could not load file or assembly 'Foo'. The system cannot find the file specified.'
背景:
- 消费应用程序是使用 .NET Core 3.1 构建的网站。
- 使用应用程序引用了使用 .NET Standard 2.0 构建的 NuGet 包。
- 消费应用程序引用了最新版本的 NuGet 包,并且构建时没有任何错误或警告。
- NuGet 包中的 DLL 在
bin\debug\netcoreapp31\
和 bin\release\netcoreapp31\
文件夹中可见。
- 在 IDE 中,可以使用 NuGet 包中类型的完整 IntelliSense,包括类型、方法和参数的 XML 文档注释。
- 在运行时,在第一次引用 NuGet 包中的任何类型时,抛出 FileNotFound 异常,报告无法找到 NuGet 包文件中的 DLL。
我试过的:
- 正在验证
.csproj
文件中的 PackageReference
条目是否正确。由于它是一个 .NET Core 应用程序,因此没有干扰程序集绑定的提示路径或程序集绑定重定向。
- 正在清除 NuGet 缓存。
- 删除并重新添加 NuGet 包。
- 强制 NuGet 通过包管理器控制台重新安装包。
- 清理并重建解决方案。
- 启用 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 为我指明了正确的方向。)
背景:
- 消费应用程序是使用 .NET Core 3.1 构建的网站。
- 使用应用程序引用了使用 .NET Standard 2.0 构建的 NuGet 包。
- 消费应用程序引用了最新版本的 NuGet 包,并且构建时没有任何错误或警告。
- NuGet 包中的 DLL 在
bin\debug\netcoreapp31\
和bin\release\netcoreapp31\
文件夹中可见。 - 在 IDE 中,可以使用 NuGet 包中类型的完整 IntelliSense,包括类型、方法和参数的 XML 文档注释。
- 在运行时,在第一次引用 NuGet 包中的任何类型时,抛出 FileNotFound 异常,报告无法找到 NuGet 包文件中的 DLL。
我试过的:
- 正在验证
.csproj
文件中的PackageReference
条目是否正确。由于它是一个 .NET Core 应用程序,因此没有干扰程序集绑定的提示路径或程序集绑定重定向。 - 正在清除 NuGet 缓存。
- 删除并重新添加 NuGet 包。
- 强制 NuGet 通过包管理器控制台重新安装包。
- 清理并重建解决方案。
- 启用 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 为我指明了正确的方向。)