Visual Studio現在使用.csproj文件來管理項目。我們可以通過右鍵單擊項目並選擇Edit <project-name> .csproj來編輯.csproj設置,如下所示。
上面項目的.csproj如下所示。
csproj文件包括與目標.NET Framework,項目文件夾,NuGet程序包引用等相關的設置。
.csproj是基於XML的格式。以下示例顯示了使用.NET Core項目的根節點Microsoft.NET.Sdk。對於Web項目,使用的SDK是Microsoft.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>應使用屬於指定包的哪些資產,但不應流到下一個項目。的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>