【问题标题】:Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.1.0.0无法加载文件或程序集'System.ComponentModel.Annotations,版本 = 4.1.0.0
【发布时间】:2017-10-18 14:07:42
【问题描述】:

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

然后我从 .NET Framework 4.6.2 测试项目中引用这个类库。它构建良好,但在运行时出现以下错误:

System.IO.FileLoadException 发生 HResult=0x80131040
Message=无法加载文件或程序集 'System.ComponentModel.Annotations,版本=4.1.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。这 定位程序集的清单定义与程序集不匹配 参考。 (HRESULT 异常:0x80131040)

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

我尝试从 net462 项目中添加对 .NET Standard 库的引用,但仍然没有成功。

我在这里遗漏了什么吗?这是一个已知的错误,如果是,有解决办法吗?

非常感谢任何帮助!

【问题讨论】:

  • 使用bindingRedirect attribute in app.config 强制使用4.3.0.0 lib
  • 对于缺少 Version=4.2.0.0 的任何人:从 NuGet Gallery 安装 System.ComponentModel.Annotations 4.4.1 已为我修复。
  • 这个问题似乎在 .Net Core 2.1 中再次恶化(与 .Net 4.7.1 结合使用)。 System.ComponentModel.Annotations 4.5.0 似乎再也找不到 Version=4.2.0.0,迫使您返回 bindingRedirect oldVersion="4.2.0.0" newVersion="4.0.0.0"/>。奇怪的是,微软显然无法用 System.ComponentModel.Annotations 解决这个问题。他们已经在那里将近两年了。
  • @JRB 你的建议对我不起作用,但对我来说是一个调整过的。我最终得到了<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.1.0" />,它解决了这个问题。
  • @t3chb0t 救了我的命!我试图使用 .NET Framework 4.8 WebForms 项目中的 .NET Standard 2.0 库,但出现此错误。添加您在 web.config 中提到的内容,并将 System.ComponentModel.Annotation v5.0.0 作为 nuget 包添加到项目中后,一切正常。谢谢!

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


【解决方案1】:

这实际上比破解配置文件要容易得多。破解配置文件有点可怕;你可能会错过一些东西!让 IDE 为您做这件事 - 希望它能做对!

  1. 右键解决方案
  2. 单击为解决方案管理 Nuget 包...
  3. 搜索 System.ComponentModel.Annotations
  4. 在您的测试项目中添加一个复选框并点击安装

现在我的单元测试运行了!太棒了!

如果您的单元测试项目中有 app.config 文件,您仍然可能需要使用 @Guillaume 的答案。

【讨论】:

    【解决方案2】:

    请在dependentAssembly 下方添加web.Configapp.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>
    

    【讨论】:

      【解决方案3】:

      通过安装我想在解决方案中的所有项目中使用的相同 System.ComponentModel.Annotations 版本来解决此问题。

      【讨论】:

        【解决方案4】:

        Linux 用户

        如果您尝试从 linux 系统生成 .exe 文件,您可能需要安装 mono

        请参阅this 链接了解如何在 ubuntu 20.04 上安装单声道

        【讨论】:

          【解决方案5】:

          在很多情况下,可以通过将以下代码添加到测试项目的 csproj 文件中来解决此问题:

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

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

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

          查看此修复有帮助的其他实例:

          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

          【讨论】:

          • 这不适用于 .NET 4.6.1 Web 应用程序。在针对 webapp 进行开发时,这个问题似乎是一个持续存在的问题。我唯一能做到的就是在手动调试 IIS 之前重新编译我的 webapp 并从解决方案中卸载它。处理这件事真是太痛苦了。
          • 我可以确认这在 .Net 4.6.1 网络应用程序中不起作用。
          • 在我的解决方案 WPF - WCF - SQL 服务器 - 我在 app.config
          • 这里的问题是,在一些更复杂的解决方案中,自动生成 BindingRedirects 对于“System.ComponentModel.Annotations”无法正常工作,因此您的建议通常很有帮助,但在这种情况下没有抓住重点。
          • 2021 不再适用 dotnet 标准
          【解决方案6】:

          我遇到了这个问题,方法是在开始时实现一个帮助程序重定向程序集(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
          }
          

          【讨论】:

            【解决方案7】:

            这通常发生在 Visual Studio 无法确定正确的 bindingRedirect 时。

            很可能是因为 nugget 的版本与生成的库的版本不匹配。

            要解决这个问题:

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

              Get-Project –All | Add-BindingRedirect

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

            2. 如果没有修复,则手动添加绑定重定向:

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

              地点:

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

            【讨论】:

              【解决方案8】:

              我通过在 Visual Studio 2019 中执行 Clean Solution 命令修复了此错误。

              【讨论】:

                【解决方案9】:

                对于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> 
                

                【讨论】:

                  【解决方案10】:

                  通过使用程序集重定向使其工作,如下所述: 只需在程序开始时调用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;
                      }
                  
                  }
                  

                  【讨论】:

                  【解决方案11】:

                  对我来说,其他解决方案都不起作用。

                  我通过自己手动添加对System.ComponentModel.DataAnnotations 的引用(通过项目 -> 引用)解决了这个问题,而不是让 Visual Studio 通过灯泡快速修复菜单处理它。

                  【讨论】:

                    【解决方案12】:

                    我有类似的问题,但以上答案都没有帮助我。事实证明解决方案非常简单,我刚刚在包管理器中运行以下命令:

                    Install-Package System.ComponentModel.Annotations -Version 4.1.0

                    【讨论】:

                    • 没有一个非常令人满意的解决方案,但这对我有用。
                    • 在撰写本文时,我必须使用 4.4.1 版
                    【解决方案13】:

                    就我而言,我使用的是 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>
                    

                    适应您所需的版本。

                    【讨论】:

                    • 顺便说一句,如果应用了我的答案的更改,则此绑定重定向应由 msbuild 在编译期间统一程序集引用时自动生成。
                    • 感谢我是
                    • 在我的例子中,我使用 .NET Framework 4.7.2 创建了控制台应用程序,最初使用 app.config 转换(用于调试/发布),然后添加了 Microsoft,EntityFrameworkCore.Sqlite 2.1.4 NuGet 包, (与 2017 年 15.8.5 相比)。我花了一点时间才发现,现有的 app.config 转换以某种方式在运行时破坏了绑定重定向。 (删除转换后它开始工作)
                    猜你喜欢
                    • 2020-01-14
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-12-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多