无法加载文件或程序集&System; Component.ComponentModel.Annotations,Version = 4.1.0.0

时间:2017-05-18 16:25:16

标签: .net visual-studio-2017 .net-standard .net-standard-1.4

我有一个.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标准库的引用,但仍然没有运气。

我在这里遗漏了什么吗?这是一个已知的错误,如果可以解决这个问题吗?

非常感谢任何帮助!

12 个答案:

答案 0 :(得分:33)

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

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

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

原因是“经典”csproj测试项目是真正的“库”,默认情况下不认为需要绑定重定向。但运行单元测试需要这样做。如果引用的项目需要这些重定向才能正常工作,这只会成为一个问题。这通常适用于直接安装引用库使用的所有NuGet包,但使用新的PackageReference样式的NuGet包时,它不会。

请参阅此修补程序有帮助的其他实例:

Could not load file or assembly Microsoft.Extensions.DependencyInjection.Abstractions, Version=1.1.0.0

When using .Net Standard 1.4 in a library and .Net framework 4.6.1 in and application, unable to load file System.IO.FileSystem, Version=4.0.1.0

答案 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时发生。

最可能的原因是金块的版本与生产的库的版本不匹配。

要解决此问题,请执行以下操作:

  1. 从程序包管理控制台执行:

    Get-Project –All | Add-BindingRedirect

    在配置文件中重新生成assemblyBinding配置

  2. 如果id无法修复,请手动添加绑定重定向:

    <dependentAssembly>
        <assemblyIdentity name="System.ComponentModel.Annotations"    publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-X" newVersion="Y" />
    </dependentAssembly>
    

    其中:

    1. X是错误消息中无法加载的版本
    2. Y是项目参考上的版本。要获取它,请从引用节点中选择库,然后在属性窗格中查找版本。

答案 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)

Linux用户

如果您试图从Linux系统生成.exe文件,则可能必须安装mono

有关如何在ubuntu 20.04上安装Mono的信息,请参见this链接

答案 11 :(得分:0)

请在您的 dependentAssemblyweb.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>