.net 5的項目目錄結構和.net framework有些明顯的變化,包括顯示結構和項目文件,從這兩個方面看看有哪些變化。
項目目錄結構
就以上篇用的demo項目為例(【.net 知新:【2】 .Net Framework 、.Net 5、 .NET Standard的概念與區別】),先看看.net 5項目目錄結構。

.net5 項目和原來.net framework項目最大的不同在於引用和項目文件,.net 5變成了依賴項,里面清晰的區分了包、分析器、框架、項目等內容,這樣分門別類更方便我們查找和管理引用。

.net framework的所有引用都顯示在一起,包括其它項目、nuget包、dll等等引用。但是他們最終都是用項目文件來管理這些東西,所以我們再看看他們項目文件的差異。
項目文件
在兩個項目中都引用了nuget包 Newtonsoft.Json,添加了ClassLibraryTest項目引用,建了一個Class1.cs的類文件。
在項目里面找到項目文件.csproj,打開兩個文件對比,左邊是.net 5右邊是.net framework 4.6.1。

相對於.net framewokr而言,.net 5項目文件會少很多內容:
在.net framework中所有引用類庫都包含在項目文件中,.net 5是包含在框架中。
在.net framework中所有包含文件描述都在項目文件中,.net 沒有任何項目包含文件的描述。
所以.net 5的項目文件描述信息在哪兒呢,現在我在項目中排除類文件Class1.cs。

再打開兩個項目文件對比,折疊起其他項。
在.net 5中排除項用<Compile Remove="Class1.cs" />" 在編譯的時候移除Class1.cs。
在.net framework中因為是包含了所有的項目文件,所以排除就將<Compile Include="Class1.cs" />移除就行了。
.net 5中的這個小的改動會讓我們的項目文件大大減少,試想如果我們的文件成千上萬個那么.csproj的大小和閱讀.net 5就會是巨大優勢。
.net 5中默認是包含所有文件,如果要排除某文件直接去除包含項就行了,但是作為一個正常項目不會有太多的排除而是大量的包含,所以.net 5的改動優化相當精妙。
.net 5可以直接雙擊項目就能在vs中打開.csproj,.net framework需要到目錄中去打開。

項目發布
可在兩種模式下發布使用 .NET 創建的應用程序,模式會影響用戶運行應用的方式。
將應用作為獨立應用,生成的應用程序將包含 .NET 運行時和庫,以及該應用程序及其依賴項。 應用程序的用戶可以在未安裝 .NET 運行時的計算機上運行該應用程序。
如果將應用發布為依賴於框架的應用,生成的應用程序將僅包含該應用程序本身及其依賴項。 應用程序的用戶必須單獨安裝 .NET 運行時。
默認情況下,這兩種發布模式都會生成特定於平台的可執行文件。 不使用可執行文件也可以創建依賴於框架的應用程序,這些應用程序是跨平台的。
首先我們項目右鍵發布,選擇文件夾方式發布,然后就生成了發布配置。

點擊編輯或者設置可以進行發布項配置。如上面官方文檔描述,有【獨立】和【依賴框架】兩種方式。
如果發布【依賴框架】那么運行環境需要安裝.net 運行時,並且在發布配置“目標運行時”可以選擇“可移植”,因為運行時是自主安裝不需要包含,所以不需要發布指定的運行時。

如果選擇【獨立】那么“目標運行時”只能選擇特定的。因為包含了.net運行時和庫,所以需要進行選擇。如果不選擇特定平台,這樣就沒辦法將.net運行時和庫正確的發布。

發布項目,然后到發布目錄看下兩種方式的文件區別
- 依賴框架->可移植

- 獨立->win-x64(太長了截取一部分)

以上就是發布的簡單介紹,采用獨立的方式發布時間會久一點,另外在發布配置里面還有個“文件發布選項”,有幾個配置簡單說明下,有興趣的可以對比下發布的文件區別。

- 生成單個文件:這個就是字面意思,通過將所有依賴應用程序的文件捆綁到一個二進制文件中,這種方式適用於將項目用作第三方庫或者應用程序,方便傳輸管理。
- 啟用ReadyToRun編譯:可以通過將應用程序集編譯為 ReadyToRun (R2R) 格式來改進 .NET Core 應用程序的啟動時間和延遲。R2R 二進制文件通過減少應用程序加載時實時 (JIT) 編譯器需要執行的工作量來改進啟動性能。
- 裁剪未使用的程序集:也是字面意思,目前還是預覽版,無法可靠地分析各種有問題的代碼模式(主要集中在反射使用),應用程序的生成時間分析可能會導致運行時失敗。這個功能最有用的應該是獨立發布的方式,通過裁剪以減小部署大小。
