.Net程序集绑定引用问题

4
我有一个名为AB的.NetStandard 2.0项目,引用了A和B两个项目。A是一个.Net Standard 2.0项目,需要System.ComponentModel.DataAnnotation,其来自于System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a。B是一个.NetFramework4.6.1项目,也需要System.ComponentModel.DataAnnotation,但其来源于System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35。
当构建AB程序集时,它只会发出一个System.ComponentModel.DataAnnotation.dll,恰好来自于B项目。因此,在使用AB程序集时,无法实例化A项目中的对象,会出现以下错误:
System.IO.FileNotFoundException: 未能加载文件或程序集 'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或它的某一个依赖项。
但是B项目中的对象可以正常工作。该如何解决问题呢?
请注意,只要使用者是.Net消费者(标准版或框架版),就不会出现问题。问题发现在我们的非.Net消费者开始使用我们的库时。

请问你有没有解决方案可以分享? - oleksa
我们必须采用多目标技术。 - daregazi
1个回答

2

在项目AB的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>

1
谢谢。这是自然发生的事情,但并没有解决问题。问题在于我们需要在A和B项目中使用的IValidatableObject接口被不同地解析。在A中,它来自Annotations.dll(Nuget包),而在B中,它直接来自Framework 4本身的DataAnnotations.dll。然而,在A和B中,我们都引用了Microsoft.Extensions.Logging,它在内部使用Annotations.dll包。理想情况下,可以绕过B直接使用DataAnnotations。 - daregazi
始终引用NuGet包,同时支持.NET Standard 2.0和完整的.NET。 - magicandre1981
我通过将多框架目标添加到AB项目中来修复了相同的错误,如下所示:<TargetFrameworks>netstandard2.0;net472</TargetFrameworks> 然后可以像所示那样为netstandard添加packageReference或为net目标添加reference。 - oleksa

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