如何使用 csproj 多目标 .NET Core class 库?
How do you multi-target a .NET Core class library with csproj?
当 .NET Core 仍然使用 project.json
格式时,您可以构建一个 class 库 targeting multiple frameworks(例如 net451、netcoreapp1.0)。
既然官方项目格式是 csproj
使用 MSBuild,您如何指定多个框架作为目标?我试图从 VS2017 中的项目设置中寻找这个,但我只能从 .NET Core 框架中定位一个框架(它甚至没有列出我 [=21= 的其他完整 .NET Framework 版本]do 已安装):
您可以为此手动编辑 .csproj
文件并设置 TargetFrameworks
(不是 TargetFramework
)属性.
<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>
例如见EFCore.csproj
:
https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csproj
I actually selected Class Library (.NET Core).
如果您的库需要在多个平台目标上工作,那不是您想要的项目模板。使用此项目模板,您的库只能用于面向 .NETCore 的项目。 PCL 库方法已停用,您现在必须选择 .NETStandard。
您可以通过使用 "Class Library (.NET Standard)" 项目模板启动项目来实现。您现在可以选择 .NETStandard 版本。当前兼容性网格 is here。
希望他们会更新链接的文章。这是不断变化的,.NETStandard 2.0 已确定但尚未发布。目标是 2017 年第二季度,可能 spring 结束,目前显示已完成 97%。偷听设计师说不推荐使用1.5或者1.6,和2.0兼容性不够
需要手动编辑工程文件,在默认的TargetFramework中添加s,基本改成 TargetFrameworks。然后你用 ; 分隔符提到 Moniker。
您也可以手动或使用 VS Nuget 包管理器将 Nuget 包引用放入条件 ItemGroup。
您的 .csproj 应该如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net452'">
<PackageReference Include="Microsoft.Azure.DocumentDB">
<Version>1.12.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
<PackageReference Include="Microsoft.Azure.DocumentDB.Core">
<Version>1.1.0</Version>
</PackageReference>
</ItemGroup>
</Project>
由于缺少文档,我最近做的另一个解决方法是我在 VS2015 中创建一个项目并使用可用的文档和智能感知形成 project.json,然后在 VS2017 中打开解决方案并使用内置的升级。然后我将查看 csproj 文件以弄清楚如何进行该配置。
没有 Moniker 的多目标更深奥的目标:
微软:
PCLs are not recommended+
Although PCLs are supported, package authors should support
netstandard instead. The .NET Platform Standard is an evolution of
PCLs and represents binary portability across platforms using a single
moniker that isn't tied to a static like like portable-a+b+c monikers.
如果您想要定位一个便携式配置文件,它没有预定义的 moniker,因此便携式配置文件也无法推断 TargetFrameworkIdentifier
、TargetFrameworkVersion
, 和 TargetFrameworkProfile
。编译器常量也不是自动定义的。最后,您必须添加默认提供的所有程序集引用 none。
下面的示例取自使用 dynamic
关键字的项目,因此它还需要 Microsoft.CSharp
程序集,因此您可以看到它是如何引用不同目标的。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.5;net40;portable40-net45+sl5+win8+wp8</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
<TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
<DefineConstants>$(DefineConstants);PORTABLE158</DefineConstants>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)'=='netstandard1.5'">
<PackageReference Include="Microsoft.CSharp" Version="4.3.0" />
<PackageReference Include="System.ComponentModel" Version="4.3.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net40'">
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Windows" />
</ItemGroup>
</Project>
我做了一个 simple guide to multi-targeting net framework and netcore,从最短 15 秒的修复开始,然后带您了解每个并发症。
最简单的方法是:
- 首先, 使 netcore 或 netstandard 目标正常工作。
然后
编辑 .csproj
项目文件并对其他目标完成这些步骤。
- 将
<TargetFramework>
标记更改为 <TargetFrameworks>
并将您的下一个目标添加到列表中,由 ;
分隔
- 了解 csproj 文件中的条件部分。为每个目标创建一个。使用它们来声明每个目标的依赖关系。
- 为任何网络框架目标添加
<Reference />s
for System.* dll,只需阅读构建错误消息所说的缺失内容即可。
- 在每个目标不相同的情况下处理 NuGet
<PackageReference />s
依赖项。 (这里最简单的技巧是暂时恢复到单一目标,这样 GUI 就会为您正确处理 Nuget 引用)。
- 如果您必须: 学习各种创造性的技术、解决方法和节省时间的方法来处理无法在所有目标上编译的代码。
- 当添加更多目标的成本太高时,知道何时减少损失。
当 .NET Core 仍然使用 project.json
格式时,您可以构建一个 class 库 targeting multiple frameworks(例如 net451、netcoreapp1.0)。
既然官方项目格式是 csproj
使用 MSBuild,您如何指定多个框架作为目标?我试图从 VS2017 中的项目设置中寻找这个,但我只能从 .NET Core 框架中定位一个框架(它甚至没有列出我 [=21= 的其他完整 .NET Framework 版本]do 已安装):
您可以为此手动编辑 .csproj
文件并设置 TargetFrameworks
(不是 TargetFramework
)属性.
<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>
例如见EFCore.csproj
:
https://github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csproj
I actually selected Class Library (.NET Core).
如果您的库需要在多个平台目标上工作,那不是您想要的项目模板。使用此项目模板,您的库只能用于面向 .NETCore 的项目。 PCL 库方法已停用,您现在必须选择 .NETStandard。
您可以通过使用 "Class Library (.NET Standard)" 项目模板启动项目来实现。您现在可以选择 .NETStandard 版本。当前兼容性网格 is here。
希望他们会更新链接的文章。这是不断变化的,.NETStandard 2.0 已确定但尚未发布。目标是 2017 年第二季度,可能 spring 结束,目前显示已完成 97%。偷听设计师说不推荐使用1.5或者1.6,和2.0兼容性不够
需要手动编辑工程文件,在默认的TargetFramework中添加s,基本改成 TargetFrameworks。然后你用 ; 分隔符提到 Moniker。
您也可以手动或使用 VS Nuget 包管理器将 Nuget 包引用放入条件 ItemGroup。
您的 .csproj 应该如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net452'">
<PackageReference Include="Microsoft.Azure.DocumentDB">
<Version>1.12.0</Version>
</PackageReference>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'">
<PackageReference Include="Microsoft.Azure.DocumentDB.Core">
<Version>1.1.0</Version>
</PackageReference>
</ItemGroup>
</Project>
由于缺少文档,我最近做的另一个解决方法是我在 VS2015 中创建一个项目并使用可用的文档和智能感知形成 project.json,然后在 VS2017 中打开解决方案并使用内置的升级。然后我将查看 csproj 文件以弄清楚如何进行该配置。
没有 Moniker 的多目标更深奥的目标:
微软:
PCLs are not recommended+
Although PCLs are supported, package authors should support netstandard instead. The .NET Platform Standard is an evolution of PCLs and represents binary portability across platforms using a single moniker that isn't tied to a static like like portable-a+b+c monikers.
如果您想要定位一个便携式配置文件,它没有预定义的 moniker,因此便携式配置文件也无法推断 TargetFrameworkIdentifier
、TargetFrameworkVersion
, 和 TargetFrameworkProfile
。编译器常量也不是自动定义的。最后,您必须添加默认提供的所有程序集引用 none。
下面的示例取自使用 dynamic
关键字的项目,因此它还需要 Microsoft.CSharp
程序集,因此您可以看到它是如何引用不同目标的。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard1.5;net40;portable40-net45+sl5+win8+wp8</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
<TargetFrameworkIdentifier>.NETPortable</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile158</TargetFrameworkProfile>
<DefineConstants>$(DefineConstants);PORTABLE158</DefineConstants>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)'=='netstandard1.5'">
<PackageReference Include="Microsoft.CSharp" Version="4.3.0" />
<PackageReference Include="System.ComponentModel" Version="4.3.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='net40'">
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)'=='portable40-net45+sl5+win8+wp8'">
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Windows" />
</ItemGroup>
</Project>
我做了一个 simple guide to multi-targeting net framework and netcore,从最短 15 秒的修复开始,然后带您了解每个并发症。
最简单的方法是:
- 首先, 使 netcore 或 netstandard 目标正常工作。
然后
编辑 .
csproj
项目文件并对其他目标完成这些步骤。- 将
<TargetFramework>
标记更改为<TargetFrameworks>
并将您的下一个目标添加到列表中,由;
分隔
- 了解 csproj 文件中的条件部分。为每个目标创建一个。使用它们来声明每个目标的依赖关系。
- 为任何网络框架目标添加
<Reference />s
for System.* dll,只需阅读构建错误消息所说的缺失内容即可。 - 在每个目标不相同的情况下处理 NuGet
<PackageReference />s
依赖项。 (这里最简单的技巧是暂时恢复到单一目标,这样 GUI 就会为您正确处理 Nuget 引用)。 - 如果您必须: 学习各种创造性的技术、解决方法和节省时间的方法来处理无法在所有目标上编译的代码。
- 当添加更多目标的成本太高时,知道何时减少损失。
- 将