.Csproj文件學習筆記


Visual Studio現在使用.csproj文件來管理項目。我們可以通過右鍵單擊項目並選擇Edit <project-name> .csproj來編輯.csproj設置,如下所示。

 

上面項目的.csproj如下所示。

 

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

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

<Project Sdk="Microsoft.NET.Sdk">
...
</Project>

我們可以自己直接編輯.csproj文件,手動添加必要的項目。所需的確切代碼取決於需要鏈接的文件類型以及所需的MSBuild操作類型。

例如,如果我們要通過鏈接從項目外部添加.cs文件,則可以使用套在<ItemGroup>中的元素<compile>

<ItemGroup>
  <Compile Include="..\OtherFolder\MySharedClass.cs" Link="MySharedClass.cs" />
</ItemGroup>

Include給出項目文件夾中文件的相對路徑,Link屬性告訴MSBuild將文件添加為鏈接,以及應該用該文件的名稱。甚至可以更改文件名。

諸如JSON配置文件之類的內容文件,我們可以使用<content>元素,例如:

<ItemGroup>
  <Content Include="..\Shared\SharedSettings.json" Link="SharedSettings.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

在此示例中,我CopyToOutputDirectory設置為PreserveNewest,以便在構建或發布項目時將文件復制到輸出目錄。

PackageReference元素指定項目的NuGet依賴Include屬性指定包ID

<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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM