【问题标题】:.Net assembly binding referencing issue.Net 程序集绑定引用问题
【发布时间】:2019-08-13 23:01:19
【问题描述】:

我有一个名为 AB 的 .NetStandard 2.0 项目,它引用了项目 A 和 B。 项目 A 是一个 .Net Standard2.0,它需要 System.ComponentModel.DataAnnotation 来自 System.ComponentModel.Annotations,版本=4.2.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a。

然而,项目 B 是一个 .NetFramework4.6.1 项目,它还需要 System.ComponentModel.DataAnnotation 解决方案 System.ComponentModel.DataAnnotations,版本=4.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35。

在构建 AB 程序集时,它只发出一个 System.ComponentModel.DataAnnotation.dll,恰好来自项目 B。

因此,在使用 AB 程序集时,项目 A 中的对象无法实例化并出现错误:

System.IO.FileNotFoundException:无法加载文件或程序集 'System.ComponentModel.Annotations,版本=4.2.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。

但是项目 B 中的对象正常工作。

我该如何解决这个问题?

请注意,只要消费者是 .Net 消费者(标准或框架)就没有问题。当我们的非 .Net 消费者开始使用我们的库时,问题就被发现了。

【问题讨论】:

  • 如果有解决办法,请分享一下吗?
  • 我们不得不使用多目标。

标签: c# .net-framework-version .net-standard-2.0


【解决方案1】:

检查项目 AB 的framework to reference a specific version in the csproj

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="System.ComponentModel.Annotations" Version="4.5.0" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System.ComponentModel.DataAnnotations" />
</ItemGroup>

【讨论】:

  • 谢谢。这是自然发生的事情,并没有解决问题。问题是我们需要在项目 A 和 B 中使用的 IValidatableObject 接口的解决方式不同。在 A 中,它来自 Annotations.dll(Nuget 包),而在 B 中,它直接来自框架 4 原生的 DataAnnotations.dll。但是,在 A 和 B 中,我们都有对 Microsoft.Extensions.Logging 的引用,它使用Annotations.dll 包在内部。理想的是能够直接使用 DataAnnotations 绕过 B
  • 始终参考 .net 标准 2.0 和完整 .net 的 nuget 包。
  • 这应该被标记为答案。我已经通过将多框架目标添加到项目 AB 来修复相同的错误,例如 &lt;TargetFrameworks&gt;netstandard2.0;net472&lt;/TargetFrameworks&gt; 然后可以为 netstandard 添加 packageReference 或为 net 目标添加参考,如图所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
相关资源
最近更新 更多