【问题标题】:Could not load file or assembly 'System.ComponentModel.Annotations' in published .Net 4.6.1 project referencing .Net Standard library无法在引用 .Net 标准库的已发布 .Net 4.6.1 项目中加载文件或程序集“System.ComponentModel.Annotations”
【发布时间】:2017-12-13 23:46:13
【问题描述】:

请注意:这不是Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.1.0.0 的重复。 与链接的问题不同,此问题仅在发布应用程序后 发生。正如您将在下面看到的,我已经尝试了该帖子中提出的所有解决方案,但均未成功。

此问题发生在 WPF .Net Framework 4.6.1 项目中,该项目引用了本身引用 System.ComponentModel.Annotations NuGet 包的 .Net Standard 2.0 库。

该问题在以下项目中重现:https://github.com/kaitlynbrown/DataAnnotationsError

重现错误:

  1. 克隆上面链接的仓库
  2. 克隆上面链接的仓库
  3. 在 Visual Studio 中打开解决方案
  4. 在 Visual Studio 中,构建 -> 发布
  5. 点击完成
  6. 安装并运行已发布的应用程序

您将看到以下错误:

我已经尝试了很多方法来解决这个问题,包括:

将以下行添加到 WPF 项目的 .csproj:

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>

在 App.config 中添加以下绑定重定向:

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

在 WPF 项目中添加对 System.ComponentModel.Annotations NuGet 包的引用

这些都不起作用。

请注意:问题在于不是在 Visual Studio 中构建和运行。我能够做到这一点而不会出错。尝试发布应用程序并随后运行已发布的应用程序时会出现此问题。

【问题讨论】:

  • 在你项目的 bin 文件夹中是否有来自其他项目的 dll?如果是这样放在发布文件夹中。还可以尝试使用与任何 PC 兼容的 x86 选项进行构建。
  • 在我的实际项目中,System.ComponentModel.Annotations 是唯一一个其 dll 未复制到发布文件夹的 NuGet 包。它确实出现在 bin 文件夹中(以及我的其他项目的 dll 和所有 NuGet 包引用),并且所有其他 dll 似乎都被复制到了发布文件夹中,除了这个。
  • 用记事本打开.proj文件,检查是否有任何特殊说明可以复制工作的dll。
  • 只有我添加的驱动我连接的硬件的 dll。出于某种原因,除了 System.ComponentModel.Annotations 之外,NuGet 包及其依赖项都会自动复制(应该如此)
  • 我想知道这些指令在哪里复制 dll。它必须在当前项目或 2.0 库中。 2.0 项目可能没有在说明中包含 dll,这就是它没有复制的原因。网络库也无法识别较旧的 dll,并且不会获得副本。我对 Net 无法识别的旧 dll 有类似的问题。要使用 dll,我有一个从 c# 调用的 c++ 包装器 dll。我必须手动将原始脚本移动到 bin 文件夹进行编译。我从不费心提出移动这个 dll 的指令。

标签: c# .net .net-assembly .net-standard assembly-binding-redirect


【解决方案1】:

Visual Studio 中存在与 ClickOnce 发布相关的错误,其中发布逻辑似乎试图变得聪明,并且“有用地”排除了它认为是框架一部分的 DLL。当然,在混合替换完整框架功能的 .NET Standard 包时,这会导致各种问题。

参考:

我没有亲自尝试过 GitHub 问题中建议的解决方法,但 System.Net.Http.dll 遇到了类似的问题,通过将 NuGet 包中的 dll 链接显式添加到项目文件(添加现有 > 显示所有文件 > 添加为链接)并设置“始终复制”。需要明确的是:我的意思是将 dll 添加为“内容”——而不是添加对 dll 的引用。链接的 DLL 将始终被复制到发布输出。

【讨论】:

  • 您提供的链接中的解决方法不起作用,但链接 nuget dll 似乎目前可以作为一种解决方法。不幸的是,我不确定如何以确保更新 nuget 包时更新 dll 的方式做到这一点,并且能够在可能存储的其他机器上运行构建他们在不同位置的 nuget 包
【解决方案2】:

运行已发布的应用程序版本后我没有遇到错误。

但是我今天在我正在制作的应用程序中遇到了这个问题。问题是应用程序的调试运行良好,但单元测试因此错误而失败。我通过将 .NET 框架版本从 4.7 增加到 4.7.2 并将 AutoGenerateBindingRedirects、GenerateBindingRedirectsOutputType 设置为 true 来解决此问题,如您所述。测试在 4.8 上也能正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多