.Csproj文件學習筆記

Visual Studio如今使用.csproj文件來管理項目。咱們能夠經過右鍵單擊項目並選擇Edit <project-name> .csproj來編輯.csproj設置,以下所示。json

 

上面項目的.csproj以下所示。api

 

csproj文件包括與目標.NET Framework,項目文件夾,NuGet程序包引用等相關的設置。框架

.csproj是基於XML的格式。如下示例顯示了使用.NET Core項目的根節點Microsoft.NET.Sdk。對於Web項目,使用的SDKMicrosoft.NET.Sdk.Webui

<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>應使用屬於指定包的哪些資產,但不該流到下一個項目。的AnalyzersBuildContentFiles資產都默認爲私享此屬性不存在。

多個目標框架

咱們能夠建立.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>
相關文章
相關標籤/搜索