如何创建多目标但针对每个框架的不同 dll 的 .NET Core 库?
How to create a .NET Core library that is Multi-Targeting but targets different dll's per framework?
我正在尝试将当前针对 .NET4.0 的库更新为:
- 网络标准 2.0
- NET4.5.2
使用多目标。
我使用的依赖库是Microsoft.Build.Framework
。它出现在两个地方:
NuGet
最低级别为 NET4.6
- GAC 通过完整框架(例如
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.Build.Framework.dll
)
因为nuget包最低级别在4.5.2以上,我不能在452目标中使用那个nuget包。
那么,是否可以这样说:
- 使用NS20时,请使用nuget包。
- 使用NET4.5.2时,请使用GAC版本。
谢谢!
诀窍是修改您的csproj
并手动指定要在任一特定框架下使用的包。
这就是我最终所做的。注意事项:
PackageReference
:从 NuGet 获取。
Reference
:从您的 GAC 获取。
.
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<PackageReference Include="Microsoft.Build.Framework" Version="15.7.179" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.7.179" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net452' ">
<Reference Include="Microsoft.Build.Framework" Version="15.7.179" />
<Reference Include="Microsoft.Build.Utilities.v4.0" Version="15.7.179" />
</ItemGroup>
所以在这里,如果框架是 NS20
,我们从 NuGet 获取包,而如果是 NET452
.
,我们尝试从 GAC 获取它们
胜者胜者,吃鸡大餐!
您可以根据当前项目正在构建的目标框架,有条件地定义您的依赖项。为此,您将调整项目文件以在一种情况下使用 NuGet 依赖项,或在另一种情况下使用标准的非 NuGet 引用。
看起来像这样:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- other properties -->
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<!-- common references -->
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net452'">
<Reference Include="Microsoft.Build.Framework" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'net452'">
<PackageReference Include="Microsoft.Build.Framework" Version="15.7.179" />
</ItemGroup>
</Project>
因此 net452
将获得带有 Reference
element, which can be resolved from the GAC or the local directory, and other frameworks will resolve it from NuGet using a PackageReference
的正常程序集引用 Microsoft.Build.Framework
。
我正在尝试将当前针对 .NET4.0 的库更新为:
- 网络标准 2.0
- NET4.5.2
使用多目标。
我使用的依赖库是Microsoft.Build.Framework
。它出现在两个地方:
NuGet
最低级别为 NET4.6- GAC 通过完整框架(例如
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.Build.Framework.dll
)
因为nuget包最低级别在4.5.2以上,我不能在452目标中使用那个nuget包。
那么,是否可以这样说: - 使用NS20时,请使用nuget包。 - 使用NET4.5.2时,请使用GAC版本。
谢谢!
诀窍是修改您的csproj
并手动指定要在任一特定框架下使用的包。
这就是我最终所做的。注意事项:
PackageReference
:从 NuGet 获取。Reference
:从您的 GAC 获取。
.
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
<PackageReference Include="Microsoft.Build.Framework" Version="15.7.179" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.7.179" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net452' ">
<Reference Include="Microsoft.Build.Framework" Version="15.7.179" />
<Reference Include="Microsoft.Build.Utilities.v4.0" Version="15.7.179" />
</ItemGroup>
所以在这里,如果框架是 NS20
,我们从 NuGet 获取包,而如果是 NET452
.
胜者胜者,吃鸡大餐!
您可以根据当前项目正在构建的目标框架,有条件地定义您的依赖项。为此,您将调整项目文件以在一种情况下使用 NuGet 依赖项,或在另一种情况下使用标准的非 NuGet 引用。
看起来像这样:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- other properties -->
<TargetFrameworks>netstandard2.0;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<!-- common references -->
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net452'">
<Reference Include="Microsoft.Build.Framework" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'net452'">
<PackageReference Include="Microsoft.Build.Framework" Version="15.7.179" />
</ItemGroup>
</Project>
因此 net452
将获得带有 Reference
element, which can be resolved from the GAC or the local directory, and other frameworks will resolve it from NuGet using a PackageReference
的正常程序集引用 Microsoft.Build.Framework
。