当.NET Core仍使用该project.json
格式时,您可以构建一个针对多个框架的类库(例如net451,netcoreapp1.0)。
现在,正式的项目格式正在csproj
使用MSBuild,您如何指定多个目标框架?我试图寻找这个在VS2017的项目设置,但我能只针对从.NET框架的核心在单一框架(它甚至没有列出我的其他完整的.NET框架版本都已经安装) :
当.NET Core仍使用该project.json
格式时,您可以构建一个针对多个框架的类库(例如net451,netcoreapp1.0)。
现在,正式的项目格式正在csproj
使用MSBuild,您如何指定多个目标框架?我试图寻找这个在VS2017的项目设置,但我能只针对从.NET框架的核心在单一框架(它甚至没有列出我的其他完整的.NET框架版本都已经安装) :
Answers:
您需要手动编辑项目文件,并将s添加到默认的TargetFramework并将其基本上更改为TargetFrameworks。然后,你提到的名字对象用; 分隔器。
您也可以手动或使用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中创建一个项目,并使用可用的文档和intellisense形成project.json,然后在VS2017中打开解决方案并使用内置升级。然后,我将查看csproj文件,以了解如何进行该配置。
在没有Moniker的情况下进行多目标更深奥的目标:
微软:
不建议使用PCL +
尽管支持PCL,但程序包作者应改为支持netstandard。.NET平台标准是PCL的发展,它使用一个单独的名称来表示跨平台的二进制可移植性,该名称未与可移植a + b + c此类静态名称绑定在一起。
如果你想针对便携式个人资料不具有预定义的绰号因此便携式个人档案也不能推断TargetFrameworkIdentifier
,TargetFrameworkVersion
和TargetFrameworkProfile
。此外,不会自动定义编译器常量。最后,您必须添加所有程序集引用,默认情况下不提供任何程序集引用。
下面的示例摘自一个使用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>
您可以.csproj
为此手动编辑文件并设置TargetFrameworks
(不设置TargetFramework
)属性。
<TargetFrameworks>net451;netstandard1.4</TargetFrameworks>
例如,请参见EFCore.csproj
:https :
//github.com/aspnet/EntityFrameworkCore/blob/951e4826a38ad5499b9b3ec6645e47c825fa842a/src/EFCore/EFCore.csproj
我实际上选择了类库(.NET Core)。
如果您的库需要在多个平台目标上工作,那不是您想要的项目模板。使用此项目模板,您的库只能在以.NETCore为目标的项目中使用。PCL库方法已淘汰,您现在必须选择.NETStandard。
您可以通过使用“类库(.NET Standard)”项目模板启动项目来实现。现在,您可以选择.NETStandard版本。当前的兼容性网格在这里。
希望他们会保持链接文章的更新。不断变化的是,.NETStandard 2.0已被确定,但尚未发布。目标定于2017年第二季度(可能是春季末),目前显示已完成97%。我听到设计师说过不建议使用1.5或1.6,与2.0兼容不够
project.json
您可以为目标框架指定特定的依赖关系。
我做了多目标网络框架和netcore的初学者指南,该指南从简单的1行修复开始,然后逐步介绍每种复杂情况。
最简单的方法是首先使netcore或netstandard目标工作。然后编辑csproj文件,并针对其他目标执行以下步骤。
<Reference />s
通过读取缺少构建错误消息的内容,为所有netframework目标添加System。* dll。<PackageReference />s
如果每个目标的NuGet依赖项不同,请处理它们。最简单的技巧是暂时还原为单个目标,以便GUI可以为您正确处理Nuget引用。