在引用.NET Standard库的已发布的.NET 4.6.1项目中,无法加载文件或程序集“System.ComponentModel.Annotations”。

5
请注意:这不是无法加载文件或程序集“System.ComponentModel.Annotations,Version=4.1.0.0的重复问题。 与链接的问题不同,此问题仅在发布应用程序后发生。如下所示,我尝试了该帖子中提出的每个解决方案,但都没有成功。
此问题出现在一个WPF .Net Framework 4.6.1项目中,该项目引用一个.Net Standard 2.0库,该库本身引用System.ComponentModel.Annotations NuGet包。
该问题在以下项目中得到复制:https://github.com/kaitlynbrown/DataAnnotationsError 要复制错误,请执行以下操作:
1.克隆上面链接的repo 2.打开Visual Studio中的解决方案 3.在Visual Studio中,选择“生成”->“发布” 4.单击完成 5.安装并运行已发布的应用程序
您将看到以下错误:

DataAnnotationError

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

将以下行添加到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选项进行构建。 - jdweng
在我的实际项目中,System.ComponentModel.Annotations 是唯一一个其dll未被复制到发布文件夹的NuGet包。它似乎出现在bin文件夹中(与我的其他项目和所有NuGet包引用的dll一起),并且除此之外的所有dll都似乎已被复制到了发布文件夹中。 - Katie
使用记事本打开.proj文件,并检查是否有任何特殊指令来复制工作中的dll文件。 - jdweng
只有我添加的驱动硬件的dll被复制。NuGet包及其依赖关系都会自动复制(应该如此),但由于某种原因,System.ComponentModel.Annotations未被复制。 - Katie
你有没有用记事本查看项目文件以找到答案? - jdweng
显示剩余4条评论
2个回答

3
在Visual Studio中有一个与ClickOnce发布相关的错误,似乎发布逻辑试图聪明地“帮忙”排除它认为是框架一部分的DLL。当混合使用替换完整框架功能的.NET Standard包时,这会导致各种问题。
参考:
- .NET Standard和Click Once的问题 (dotnet/standard on GitHub) - HttpClient库的ClickOnce部署 (Microsoft Connect)
我个人还没有尝试GitHub问题中提出的解决方法,但是遇到了类似的System.Net.Http.dll问题,通过从NuGet包向项目文件添加dll链接(添加现有项>显示所有文件>作为链接添加)并设置“始终复制”来解决。明确一点:我的意思是将dll添加为“内容” - 而不是引用dll。链接的DLL将始终被复制到发布输出。

1
你提供的链接中的解决方法都无效,但连接 NuGet DLL 似乎是目前的解决方法。不幸的是,我不确定如何以确保当 NuGet 包更新时 DLL 能够得到更新,并能在其他可能将其 nuget 包存储在不同位置的机器上运行构建。 - Katie

0

我在运行发布版本的应用程序时没有遇到错误。 输入图像描述

但是今天在我正在制作的一个应用程序中遇到了这个问题。问题是调试应用程序运行良好,但单元测试失败并出现此错误。我通过将.NET框架版本从4.7增加到4.7.2,并将AutoGenerateBindingRedirects、GenerateBindingRedirectsOutputType设置为true来解决了这个问题,就像你提到的那样。测试也可以在4.8上正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接