.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可以定義很多個,裏面都可以同等地放屬性。至於爲什麼會定義多個,原因無外乎有兩個:
- 增加可讀性 —— 將一組相關的屬性放在一起,便於閱讀和理解意圖;
- 便於加條件 —— 有的屬性在 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