Visual Studio如今使用.csproj文件来管理项目。咱们能够经过右键单击项目并选择Edit <project-name> .csproj来编辑.csproj设置,以下所示。json
上面项目的.csproj以下所示。api
csproj文件包括与目标.NET Framework,项目文件夹,NuGet程序包引用等相关的设置。框架
.csproj是基于XML的格式。如下示例显示了使用.NET Core项目的根节点Microsoft.NET.Sdk。对于Web项目,使用的SDK是Microsoft.NET.Sdk.Web。ui
<Project Sdk="Microsoft.NET.Sdk"> ... </Project>
咱们能够本身直接编辑.csproj文件,并手动添加必要的项目。所需的确切代码取决于需要连接的文件类型以及所需的MSBuild操做类型。spa
例如,若是咱们要经过连接从项目外部添加.cs文件,则可使用嵌套在<ItemGroup>中的元素<compile>:3d
<ItemGroup> <Compile Include="..\OtherFolder\MySharedClass.cs" Link="MySharedClass.cs" /> </ItemGroup>
Include给出项目文件夹中文件的相对路径,Link属性告诉MSBuild将文件添加为连接,以及应该用于该文件的名称。甚至还能够更改文件名。code
对于诸如JSON配置文件之类的内容文件,咱们能够使用<content>元素,例如:orm
<ItemGroup> <Content Include="..\Shared\SharedSettings.json" Link="SharedSettings.json" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup>
在此示例中,我们将CopyToOutputDirectory设置为PreserveNewest,以便在构建或发布项目时将文件复制到输出目录。blog
PackageReference元素指定项目的NuGet依赖。Include属性指定包IDip
<PackageReference Include="package-id" Version="" PrivateAssets="" IncludeAssets="" ExcludeAssets="" />
Version属性指定要还原的软件包的版本。
IncludeAssets属性指定<PackageReference>应使用属于指定包的哪些资产。默认状况下,包括全部包装资产。
ExcludeAssets属性指定<PackageReference>不该消耗属于指定包的资产。
PrivateAssets属性指定<PackageReference>应使用属于指定包的哪些资产,但不该流到下一个项目。的Analyzers,Build和ContentFiles资产都默认为私享此属性不存在。
多个目标框架
咱们能够建立.NET Core应用程序并为其配置多个目标框架,以便它能够与全部已配置的目标框架一块儿运行。要定位多个框架,须要更改<TargetFramework>为复数,<TargetFrameworks>并包含咱们要定位的不一样框架的别名,并用;分隔:
<PropertyGroup> <TargetFrameworks>netstandard2.0;net462</TargetFrameworks> </PropertyGroup>
条件引用
咱们可能会遇到的一个问题是,须要根据要构建的目标引用不一样的程序集或NuGet程序包。
例如,咱们将如下方法添加到咱们的库中,它将成功编译.NET Standard 2.0目标,可是.NET 4.6.2目标将失败,由于它找不到.NET的定义HttpUtility。
public string JavaScriptEncode(string input) { return HttpUtility.JavaScriptStringEncode(input); }
要解决此问题,咱们须要添加对System.Web程序集的引用,但仅.NET 4.6.2目标须要它。为此,咱们只需.csproj使用如下语法在文件中添加条件引用便可:
<ItemGroup Condition=" '$(TargetFramework)' == 'net462' "> <Reference Include="System.Web" />
</ItemGroup>
若是要有条件引用的NuGet程序包,则使用PackageReference。能够使用多个条件:
<ItemGroup Condition=" '$(TargetFramework)' == 'net462' or '$(TargetFramework)' == 'net35'"> <PackageReference Include="NAudio" Version="1.8.5" /> </ItemGroup>
条件编译
有时咱们可能想从某些目标的编译中排除某些C#文件。例如,如下是在NAudio中针对.NET 3.5目标的方法,我引用了System.Windows.Forms程序集,并从编译中排除了三个特定文件:
<ItemGroup Condition=" '$(TargetFramework)' == 'net35' ">
<Reference Include="System.Windows.Forms" />
<Compile Remove="Wave\WaveOutputs\WasapiOutRT.cs" />
<Compile Remove="Wave\WaveInputs\WasapiCaptureRT.cs" />
<Compile Remove="Wave\WaveOutputs\WaveFileWriterRT.cs" />
</ItemGroup>