.csproj 文件

.csproj 文件

.csproj,是C#項目文件的擴展名,它是“C Sharp Project”的縮寫。.net開發環境中建立項目時,會產生.csproj文件,這是C#的工程文件,其中記錄了與工程有關的相關信息,例如包含的文件,程序的版本,所生成的文件的類型和位置信息等。

【作用】

.csproj究竟是做什麼用的?它是給開發工具用的,例如我們再熟悉不過的Visual Studio,以及大家可能沒有接觸過的MSBuild.exe。

Visual Studio會根據csproj裏的XML定義來管理項目文件以及相關其他一些種類非常豐富的數據及操作,MSBuild也會根據csproj文件來得知編譯這個項目需要有哪些依賴,默認輸出路徑,Pre-Build和Post-Build需要哪些操作等。

Visual Studio和MSBuild都是開發工具,這就是csproj存在的唯一意義:爲“開發工具”提供信息。而到了運行環境中,根本不會有人關心所謂的csproj文件——也就是“程序是從哪裏來的”。

【各個部件的作用】

PropertyGroup

PropertyGrouph是用來存放屬性的地方,這與它的名字非常契合。

在這裏寫屬性就像在代碼中定義屬性或變量一樣,只要寫了,就會生成一個指定名稱的屬性。

比如,我們寫:

<PropertyGroup>
    <Foo> watermelon is a fruit </Foo>
</PropertyGroup>

那麼,就會生成一個 Foo 屬性,值爲字符串 watermelon is a fruit。至於這個屬性有什麼用,那就不歸這裏管了。

PropertyGroup可以定義很多個,裏面都可以同等地放屬性。至於爲什麼會定義多個,原因無外乎有兩個:

  1. 增加可讀性 —— 將一組相關的屬性放在一起,便於閱讀和理解意圖;
  2. 便於加條件 —— 有的屬性在 Debug 和 Release 下不一樣(例如條件編譯符 DefineConstants)。

ItemGroup

ItemGroup是用來指定集合的地方。

集合裏面一些常見的項:

  • Reference:引用某個程序集
  • PackageReference:引用某個NuGet包
  • ProjectReference:引用某個項目
  • Compile:常規的 C# 編譯
  • None:執行一些通用的操作(或者只是爲了在 Visual Studio 列表中能夠有一個顯示)
  • Folder:一個空的文件夾

ItemGroup 也可以放很多組,同樣是爲了提升可讀性或者增加條件。

Import

Import是爲了導入屬性(props)和Targets(後面會具體說Targets)。

被我們 Import 進來的那些文件,可以用兩種擴展名錶示,一種是用來定義屬性,爲 .props;另一種用來定義行爲,爲 .targets。這兩種文件除了含義不同以外,內容的格式都是完全一樣的 —— 即 csproj 文件格式。

雖然 csproj 文件中可以完全實現引入的 props 文件的功能,但爲了在多個項目中使用,一處更新,到處生效,因此選擇單獨用 props 文件來存放。

Target

一般來說, Target 節點寫在 csproj 文件的末尾,但這個並不是強制的。Targets 是一種非常強大的功能擴展方式,支持 msbuild 預定義的一些指令,支持命令行,甚至支持使用 C# 直接編寫(當然編譯成 dll 會更方便些),還支持這些的排列組合和順序安排。而我們實質上的編譯過程便全部由這些 Targets 來完成。甚至可以說,編譯過程就是靠這些 Target 的組合來完成的

Project

所有的 csproj 文件都是以 Project 節點爲根節點。

下面列出新舊兩款 csproj 文件格式的差異:

其中,在各部件中,白色代表必須,灰色代表可選;而更接近背景色的灰色代表一般情況下都是不需要的。

可以看出,新格式的最大好處之一就是簡潔。而這一優勢,靠的就是 Project 節點,新格式中的 Project 節點有 sdk 屬性 —— 所謂 sdk,其實是一大波 .targets 文件的集合。它幫我們導入了公共的屬性、公共的編譯任務,還幫我們自動將項目文件夾下所有的 **\*.cs 文件都作爲 ItemGroup 的項引入進來。

【 .sln 和 .csproj 的區別】

1. .sln:即 solution,解決方案

    .csproj:即 C sharp project,C# 項目

2. 解決方案是項目的集合,項目是文件的集合;一個 sln 中可以包含多個 csproj。一個 csproj 可以包含多個文件; csproj 可以作爲單獨的項目運行,也可以在 sln 中添加 csproj 統一管理。

3. sln 和 csproj 都可以雙擊運行,如果解決方案中只有一個項目,那麼兩個方式是沒有區別的;但是如果一個解決方案中包含多個項目, sln 會加載該解決方案中所有的項目,而 csproj 只會加載當前項目。

4. 關於 sln 和 csproj 的幾個問題

(1)C#、.net 中,.sln 文件可以刪掉重新生成嗎?

.sln 是項目文件,刪除後項目的一些設置會無法恢復,因爲解決方案裏面可能有關於這個項目文件的很多信息,所以一般不建議刪除重建;但一般也沒有太大的問題,用VS直接打開 .csproj 工程文件,會自動建上 sln 的。

(2)下載的 ASP.net 源碼沒有.sln 或 .csproj 文件如何使用?

從 Visual Studio IDE 的菜單  "文件" --> "打開" --> "網站" ,然後從右邊的目錄中選擇要打開的網站目錄,不需要有 .sln 文件就可以打開網站並調試運行。如果是 WebSite 模式那麼是不需要 .sln 文件的,可以通過 File -> WebSite -> OpenWebSite 打開。如果不是 WebSite 模式,那麼可以自己建立一個空項目,然後把文件 Copy 進去即可。

 

參考鏈接:https://blog.csdn.net/han_better/article/details/64140875

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章