我有一个引用 System.ComponentModel.Annotations (4.3.0) NuGet 包的 .NET Standard 1.4 类库。
然后我从 .NET Framework 4.6.2 测试项目中引用这个类库。它构建良好,但在运行时出现以下错误:
System.IO.FileLoadException 发生 HResult=0x80131040 消息=无法加载文件或程序集 'System.ComponentModel.Annotations, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040)
我尝试从 net462 项目中添加对 System.ComponentModel.Annotations (4.3.0) NuGet 包的引用,但这没有任何区别。
我尝试从 net462 项目中添加对 .NET Standard 库的引用,但仍然没有运气。
我在这里错过了什么吗?这是一个已知的错误,如果是,有解决办法吗?
任何帮助深表感谢!
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.1.0" />
。
在很多情况下,这可以通过将以下代码添加到测试项目的 csproj 文件中来解决:
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
这会强制构建过程在输出目录中创建一个带有所需绑定重定向的 .dll.config
文件。
原因是“经典”csproj 测试项目是真正的“库”,默认情况下不需要绑定重定向。但是运行单元测试需要这个。如果引用的项目需要这些重定向才能正常工作,这只会成为一个问题。这通常在直接安装引用库使用的所有 NuGet 包时有效,但对于 NuGet 包的新 PackageReference
样式,则不能。
查看此修复有帮助的其他实例:
我有类似的问题,但以上答案都没有帮助我。事实证明,解决方案非常简单,我刚刚在包管理器中运行了以下命令:
安装包 System.ComponentModel.Annotations -版本 4.1.0
就我而言,我使用的是 4.0.0,所以我通过添加来修复它
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations"
publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="4.1.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
适应您需要的版本。
4.2.0.0
的任何内容时,该程序集版本实际上是 4.2.1.0
,适用于高于此的每个版本。因此有效的绑定重定向是 <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.1.0" />
,即使您可能安装了 4.7.0
或 5.0.0
NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
这通常发生在 Visual Studio 无法确定正确的 bindingRedirect 时。
最有可能的原因是金块的版本与生成的库的版本不匹配。
要解决此问题:
从包管理控制台执行:Get-Project –All | Add-BindingRedirect 在配置文件中重新生成 assemblyBinding 配置如果没有修复,则手动添加绑定重定向:
4.2.0.0
的任何内容时,该程序集版本实际上是 4.2.1.0
,适用于高于此的每个版本。因此有效的绑定重定向是 <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.1.0" />
,即使您可能安装了 4.7.0
或 5.0.0
NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
通过使用程序集重定向使其工作,如下所述:只需在程序开始时调用 FunctionsAssemblyResolver.RedirectAssembly()
。 https://stackoverflow.com/a/50776946/2705777
using System.Reflection;
using System.Diagnostics;
using System.Linq;
public class FunctionsAssemblyResolver
{
public static void RedirectAssembly()
{
var list = AppDomain.CurrentDomain.GetAssemblies().OrderByDescending(a => a.FullName).Select(a => a.FullName).ToList();
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var requestedAssembly = new AssemblyName(args.Name);
Assembly assembly = null;
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
try
{
assembly = Assembly.Load(requestedAssembly.Name);
}
catch (Exception ex)
{
}
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
return assembly;
}
}
4.2.0.0
的任何内容时,该程序集版本实际上是 4.2.1.0
,适用于高于此的每个版本。因此有效的绑定重定向是 <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.1.0" />
,即使您可能安装了 4.7.0
或 5.0.0
NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
感谢@MiguelSlv,因为我的情况与使用正确的绑定重定向有关。但是,请确保当您将应用程序部署到 beta 或生产环境时,绑定重定向在您部署的 web.config 中(而不仅仅是在您的开发环境中)。我最终对 NuGet 包 System.ComponentModel.Annotations 5.0.0 使用了以下绑定重定向,该包在我的 **ASP.NET MVC Web 应用程序(.NET Framework 4.7.1)使用的 .NET Standard 2.0 类项目中使用)
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
</dependentAssembly>
请注意,4.2.1.0 是属性下显示的版本,而 5.0.0 是 NuGet 包版本。
4.2.0.0
的任何内容时,该程序集版本实际上是 4.2.1.0
,适用于高于此的每个版本。因此有效的绑定重定向是 <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.1.0" />
,即使您可能安装了 4.7.0
或 5.0.0
NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
通过安装我想在解决方案中的所有项目中使用的相同 System.ComponentModel.Annotations 版本来解决此问题。
请在您的 web.Config
或 app.Config
文件中添加以下 dependentAssembly
在 configuration
--> 下添加如下配置runtime
--> assemblyBinding
节点下:
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
</dependentAssembly>
对我来说,其他解决方案都不起作用。
我通过自己手动添加对 System.ComponentModel.DataAnnotations
的引用(通过项目 -> 引用)解决了这个问题,而不是让 Visual Studio 通过灯泡快速修复菜单处理它。
同样对于 4.2.0.0
版本错误,这已在 web.config
中为我修复:
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.6.0" />
</dependentAssembly>
</assemblyBinding>
我通过在 Visual Studio 2019 中执行 Clean Solution 命令修复了此错误。
我通过实现一个帮助函数在开始时重定向程序集来解决这个问题(在 this answer 中建议):
public static class FunctionsAssemblyResolver
{
#region Public Methods
public static void RedirectAssembly()
{
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblyOnCurrentDomain;
}
#endregion Public Methods
#region Private Methods
private static Assembly ResolveAssemblyOnCurrentDomain(object sender, ResolveEventArgs args)
{
var requestedAssembly = new AssemblyName(args.Name);
var assembly = default(Assembly);
AppDomain.CurrentDomain.AssemblyResolve -= ResolveAssemblyOnCurrentDomain;
try
{
assembly = Assembly.Load(requestedAssembly.Name);
}
catch
{ }
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblyOnCurrentDomain;
return assembly;
}
#endregion Private Methods
}
这实际上比破解配置文件要容易得多。破解配置文件有点可怕;你可能会错过一些东西!让 IDE 为您做这件事——希望它能做对!
右键单击解决方案单击管理 Nuget 包以获取解决方案...搜索 System.ComponentModel.Annotations 在您的测试项目中放置一个复选框,然后单击安装
https://i.stack.imgur.com/tht12.png
现在我的单元测试运行了!惊人的!
如果您的单元测试项目中有 app.config 文件,您仍然可能需要使用@Guillaume 的答案。
4.2.0.0
的任何内容时,该程序集版本实际上是4.2.1.0
,适用于高于此的每个版本。因此有效的绑定重定向是<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.1.0" />
,即使您可能安装了4.7.0
或5.0.0
NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。