3

我们有三个项目:

WebApp.csproj,针对 .NET Framework 2.0 编译的 ASP.NET WebForms 应用程序

Api.csproj,针对 .NET Framework 4.5 编译的 ASP.NET WebApi 2

Lib.csproj,针对 .NET Framework 2.0 编译并被上述两个项目引用。

Lib.csproj<TargetFrameworks>net20;net45</TargetFrameworks>已以新的 .NET 项目格式(.NET Core 使用的格式)重新创建,并使用该技术针对 .NET Fw 2.0 和 4.5 。

到目前为止一切顺利,我可以通过编写适当的部分来引用不同的 NuGet 包,Lib.csproj如下所示:

<ItemGroup Condition="'$(TargetFramework)' == 'net20'">    
    <PackageReference Include="NLog" Version="2.1.0.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
    <PackageReference Include="NLog" Version="4.7.8.0" />
</ItemGroup>

我可以指向 target的Api.csproj版本,如下所示:Lib.csprojnet45

<ProjectReference Include="..\..\Lib\Lib.csproj" AdditionalProperties="TargetFramework=net45">
    <Project>{32e77bcf-152c-4b64-be37-a13f49cdcab6}</Project>
    <Name>Lib</Name>
</ProjectReference>

版本net20参考,NLog 2.1.0一。net45NLog 4.7.8

问题:现在我想NLog 4.7.8Api.csprojManage Packages for Solution的.Api.csprojLib.csproj2.1.0

我尝试选择这两个项目并安装它,但是由于NLog 4.7.8net20.

所以真的,问题是 NuGet 似乎没有意识到我引用的项目是一个多目标项目,并且只看到版本中安装的 NLognet20版本,即使Api.csproj目标是正确的“风味” Lib.csproj(如果我去检查二进制文件,复制到输出文件夹的 NLog.dll 版本对于我的每个目标都是正确的)。

我尝试在互联网上查看,但无济于事。

公平地说:被复制到Api.csproj'sbin文件夹的 NLog 版本是正确的,所以它不是一个展示者。但这有点烦人,因为 NuGet 显示了我的依赖项的错误版本,然后很难判断我们实际使用的是哪个版本。

对于一些上下文:这个应用程序显然是古老的,至少WebApp.csproj。由于性能原因,我们正在Api.csproj使用async/await,并且由于该项目引用了可以异步Lib.csproj但显然无法在 .NET 2 下编译的代码,因此我们选择了Lib.csproj多目标。

4

1 回答 1

4

这里AdditionalProperties不应该是必要的:

<ProjectReference Include="..\..\Lib\Lib.csproj" AdditionalProperties="TargetFramework=net45">
    <Project>{32e77bcf-152c-4b64-be37-a13f49cdcab6}</Project>
    <Name>Lib</Name>
</ProjectReference>

如果可能,我强烈建议您更新所有项目以使用 SDK 样式的 csproj 格式。这对于遗留(核心前)Web 项目是不可能的,WebApp.csprojApi.csproj. 但是,即使是这些项目也可以使用更新的 csproj 格式的某些部分。

具体来说,他们可以使用PackageReference. 我假设您现有的 Web 项目正在使用nuget.config,但可以将它们更改为使用,PackageReference而无需实际制作 SDK 样式的 csprojs。NuGet 在使用时存在传递依赖的一些问题nuget.config,所以我只建议PackageReference在任何地方使用。

于 2021-03-15T16:45:30.640 回答