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>