.net - .net - 无法加载文件或程序集'System.ComponentModel.Annotations,Version= 4.1.0.0

我有一个.NET Standard 1.4类库,它引用System.ComponentModel.Annotations (4.3.0 )NuGet包。

然后,我从.NET框架4.6.2测试项目引用这个类库, build没问题,但是,在运行时,我得到了以下错误:

System.IO.FileLoadException occurred HResult=0x80131040
Message= could not load file or assembly'System.ComponentModel.Annotations,Version= 4.1.0.0 ,Culture=neutral ,PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies . the located assembly's manifest definition does not match the assembly reference . (来自HRESULT的异常0x80131040

我尝试添加一个对net462项目中System.ComponentModel.Annotations (4.3.0)NuGet包的引用,但是,没有任何区别。

我尝试从net462项目添加对.NET标准库的引用,但是,仍然没法运行。

我在这里错过了什么吗?如果这是个已知的错误?

任何帮助都很感激!

时间:

在许多情况下,可以通过添加测试项目的csproj文件来解决此问题:


<PropertyGroup>


 <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>


 <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>


</PropertyGroup>



这将强制构建过程在输出目录中创建一个.dll.config文件,该文件有所需的绑定重定向。

原因是"classic "csproj测试项目是真正的"libraries ",并且默认情况下不认为需要绑定重定向。但是运行单元测试需要这个

解决方案非常简单,我在包管理器中只运行了以下命令:

Install-Package System.ComponentModel.Annotations -Version 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>



选择适合您所需的版本。

使用程序集重定向功能使它正常工作,如下所述: 调用 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;


 }



}



我通过手动添加一个引用来解决 System.ComponentModel.DataAnnotations (通过项目-

...