ChatGPT解决这个技术问题 Extra ChatGPT

无法加载文件或程序集'System.ComponentModel.Annotations,版本 = 4.1.0.0

我有一个引用 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 attribute in app.config 强制使用 4.3.0.0 库
对于缺少 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 包添加到项目中后,一切正常。谢谢 !

A
Aliaaa

在很多情况下,这可以通过将以下代码添加到测试项目的 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 Web 应用程序中不起作用。
在我的解决方案 WPF - WCF - SQL server - 我在 app.config
这里的问题是,在一些更复杂的解决方案中,自动生成 BindingRedirects 对于“System.ComponentModel.Annotations”无法正常工作,因此您的建议通常是有帮助的,但在这种情况下没有抓住重点。
当您在包管理器中安装高于 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.05.0.0 NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
L
Lukasz Cokot

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

安装包 System.ComponentModel.Annotations -版本 4.1.0


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

就我而言,我使用的是 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 在编译期间统一程序集引用时,该绑定重定向应由 msbuild 自动生成。
谢谢我,它是
在我的情况下,我使用 .NET Framework 4.7.2 创建了控制台应用程序,最初使用 app.config 转换(用于调试/发布),然后添加了 Microsoft,EntityFrameworkCore.Sqlite 2.1.4 NuGet 包(VS 2017 15.8.5)。我花了一点时间才发现,现有的 app.config 转换以某种方式在运行时破坏了绑定重定向。 (删除转换后它开始工作)
当您在包管理器中安装高于 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.05.0.0 NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
M
MiguelSlv

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

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

要解决此问题:

从包管理控制台执行:Get-Project –All | Add-BindingRedirect 在配置文件中重新生成 assemblyBinding 配置如果没有修复,则手动添加绑定重定向: 其中:X 是无法加载的版本,从错误消息中 Y 是您的项目引用的版本。要获取它,请从引用节点中选择库,然后在属性窗格中查找版本。


当您在包管理器中安装高于 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.05.0.0 NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
N
Neil

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

}

这基本上就是 BenchmarkDotNet 所做的。 github.com/dotnet/BenchmarkDotNet/blob/…
当您在包管理器中安装高于 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.05.0.0 NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
s
smooveys

感谢@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.05.0.0 NuGet 包。我认为它是一个版本兼容性问题,对于混合框架/标准项目来说是一件痛苦的事情。
这是现在的正确答案。
u
user14918236

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


E
Etienne Kaiser

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

R
Rich

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

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


t
tcetin

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

u
user1605822

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


b
budul

我通过实现一个帮助函数在开始时重定向程序集来解决这个问题(在 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
7guyo

Linux 用户

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

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


J
Jess

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

右键单击解决方案单击管理 Nuget 包以获取解决方案...搜索 System.ComponentModel.Annotations 在您的测试项目中放置一个复选框,然后单击安装

https://i.stack.imgur.com/tht12.png

现在我的单元测试运行了!惊人的!

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