我有一个.NET Standard 1.4类库,它引用了System.ComponentModel.Annotations(4.3.0)NuGet包。
然后我从.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标准库的引用,但仍然没有运气。
我在这里遗漏了什么吗?这是一个已知的错误,如果可以解决这个问题吗?
非常感谢任何帮助!
答案 0 :(得分:33)
在许多情况下,可以通过添加以下测试项目的csproj文件来解决这个问题:
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
这会强制构建过程在输出目录中创建具有所需绑定重定向的.dll.config
文件。
原因是“经典”csproj测试项目是真正的“库”,默认情况下不认为需要绑定重定向。但运行单元测试需要这样做。如果引用的项目需要这些重定向才能正常工作,这只会成为一个问题。这通常适用于直接安装引用库使用的所有NuGet包,但使用新的PackageReference
样式的NuGet包时,它不会。
请参阅此修补程序有帮助的其他实例:
答案 1 :(得分:14)
我有类似的问题,但上述答案都没有帮助我。事实证明,解决方案非常简单,我只是在包管理器中运行以下命令:
Install-Package System.ComponentModel.Annotations -Version 4.1.0
答案 2 :(得分:7)
就我而言,我使用的是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>
适应您所需的版本。
答案 3 :(得分:2)
通过使用程序集重定向使其工作,如以下所述:
只需在程序开始时调用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 :(得分:1)
通过安装我想在解决方案中的所有项目中使用的相同 System.ComponentModel.Annotations 版本解决了这个问题。
答案 5 :(得分:0)
对我来说,没有其他解决方案有效。
我通过自己手动添加对System.ComponentModel.DataAnnotations
的引用(通过项目 - &gt;参考)来解决这个问题,而不是让Visual Studio通过灯泡快速修复菜单来处理它。
答案 6 :(得分:0)
还针对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>
答案 7 :(得分:0)
我通过在Visual Studio 2019中执行``清理解决方案''命令修复了此错误。
答案 8 :(得分:0)
通常在Visual Studio无法找出正确的bindingRedirect时发生。
最可能的原因是金块的版本与生产的库的版本不匹配。
要解决此问题,请执行以下操作:
从程序包管理控制台执行:
Get-Project –All | Add-BindingRedirect
在配置文件中重新生成assemblyBinding
配置
如果id无法修复,请手动添加绑定重定向:
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-X" newVersion="Y" />
</dependentAssembly>
其中:
答案 9 :(得分:0)
我遇到了这个问题,方法是在开始时实现一个辅助函数来重定向程序集(在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
}
答案 10 :(得分:0)
答案 11 :(得分:0)
请在您的 dependentAssembly
或 web.Config
文件中添加以下 app.Config
在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>