在VisualStudio中創建NetCore以上版本的專案,使用的都是新版本風格的專案檔案,
和舊版本.NetFramework版本的專案檔案區別:
- 雙擊專案可直接打開csproj檔案進行編輯配置
- 專案檔案內容的改變
- 專案屬性檔案夾圖示更改
- 專案
參考去除,改成依賴項- Nuget包參考區別
- 新版C#語法支持
- 多目標框架版本支持
- ...
其中最大的區別可以說是參考的改變,
在舊版本的專案檔案中,專案所有的參考(dll/nuget/com/專案)全部糅雜在一起(后續有個版本會用圖示區別nuget,但是有bug),對人來說很不友好,
并且nuget包的參考全部保存在專案的packages.config檔案中,但是包還原時卻是還原在解決方案檔案(sln)同目錄的packages目錄下,導致大型專案有多個解決方案同時參考一個專案時導致包路徑錯誤的問題,
對比如圖,很明顯,新版本的專案檔案依賴項更加簡潔明了,

并且除了依賴項,如果你用記事本打開過.csproj檔案,你會發現.NetFramework版本的專案檔案內容非常多,他把整個專案的檔案參考都記錄在其中,并且還有大量MSBuild相關的編譯配置等,
但是在新版風格(NetCore)的專案檔案中,大大減少,檔案默認使用檔案系統參考,不再顯示記錄在csproj檔案中,這樣可以解決以前增刪了代碼檔案而沒提交專案檔案導致的編譯錯誤,并且使得專案檔案可以很容易的手動修改各種配置,
各種優點都說完了,但是很多人會疑問,這是NetCore風格的專案檔案,并不是所有.NetFramework的專案都可以升級為Core,無須擔心,即使是.NetFramework也可以使用新版的專案檔案,只需要安裝了NetCore或者更高版本的SDK就行,最后編譯出來的程式集并不需要依賴NetCore的Runtime,
并且新版本的專案檔案支持多目標框架版本,一個專案即可編譯出多個目標框架版本的程式集,
如何遷移
如果是簡單的專案,沒有各種騷操作,直接新建一個NetCore的專案,把csproj檔案替換即可
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net40</TargetFramework>
<ApplicationIcon />
<StartupObject />
<!-- <UseWPF>true</UseWPF> -->
<!-- <UseWindowsForms>true</UseWindowsForms> -->
</PropertyGroup>
</Project>
還可使用try-convert工具升級
下面是一些升級遇到過的問題
1. AssemblyInfo.cs檔案沖突
注意默認的AssemblyInfo檔案需要洗掉,因為新的專案檔案會隱式生成程式集資訊,如果需要顯示指定,需要配置GenerateAssemblyInfo為false,并且需要使用版本通配符的話還需要配置Deterministic為false,
2. Nuget參考方式
nuget參考需要從package.config遷移到專案檔案的PackageReference節點,
2. 生成路徑帶有版本框架的檔案夾
.NetFramework的專案默認生成路徑為bin/Debug,但是Core之后會再加一層框架版本檔案夾,這是因為新版本的專案檔案支持多目標框架版本,如果不需要這層檔案夾只要修改AppendTargetFrameworkToOutputPath配置為false即可,
3. 使用多版本目標框架
NetCore風格的專案檔案支持多目標框架版本,就是一個專案可以生成多個目標框架版本的程式集,而不需要創建多個專案,該功能只需要把原本的TargetFramework節點修改成TargetFrameworks就行,使用分號分隔框架版本,例如<TargetFrameworks>net40;netcoreapp2.1;netcoreapp3.1;net5.0;net5.0-windows</TargetFrameworks>,
4. 專案構建時自動生成nuget包
NetCore風格的專案檔案只需配置好包資訊,可以在每次構建時自動生成Nuget包,并且會根據專案依賴自動生成包依賴,無須手動撰寫nuspec檔案,更多配置可參考官方檔案,也可參照我的實體
<!--自動生成Nuget包-->
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<!--生成專案Xml檔案(包)-->
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<!--除錯符號檔案嵌入到dll中,以便附加除錯nuget包程式(專案生成nuget包默認不含pdb檔案,想要除錯需要用符號包或者下面方式)-->
<!-- https://docs.microsoft.com/zh-cn/dotnet/core/deploying/single-file#include-pdb-files-inside-the-bundle -->
<!-- https://docs.microsoft.com/zh-cn/nuget/create-packages/symbol-packages-snupkg -->
<DebugType>embedded</DebugType>
<!--包資訊-->
<PackageIcon>Logo.png</PackageIcon>
<Authors>XXXX</Authors>
<Company>XXXX</Company>
<Description>XXXX</Description>
<!--包版本-->
<Version Condition="'$(Configuration)' == 'Debug'">0.1.5-$(Time)</Version>
<Version Condition="'$(Configuration)' == 'Release'">0.1.5</Version>
5. 無法用命令dotnet build編譯帶資源檔案的專案
如果是Winform或在WPF專案,大概率會有資源檔案,如果使用vs功能選單生成則沒有此問題,但是使用dotent cli進行編譯則會出現以下錯誤,但是這是NetCore專案才會出現的問題和處理方式,目前暫時不知道有什么解決方法,由于沒有CI/CD的需求,也就沒有過多深究了,
C:\Program Files\dotnet\sdk\5.0.400\Microsoft.Common.CurrentVersion.targets(3162,5): error MSB3823: 非字串資源要求將屬性 GenerateResourceUsePreserializedResources 設定為 true, [E:\xxxx.csproj]
C:\Program Files\dotnet\sdk\5.0.400\Microsoft.Common.CurrentVersion.targets(3162,5): error MSB3822: 非字串資源要求在運行時使用 System.Resources.Extensions 程式集,但未在此專案的參考中找到它, [E:\xxxx.csproj]
6. 低版本框架使用高版本C#語法
.NetFramework的專案最高只能支持C#7.3(貌似?不太記得了),許多C#8/C#9以及即將發布的C#10的新特性無法使用,升級后如果不指定會默認支持框架版本兼容的C#版本,但是可以手動配置專案專案的LangVersion指定使用相應版本的C#,除了一些需要框架支持的新特性,大部分語法特性都可以支持,例如單行using,switch運算式,頂級陳述句,init關鍵字,匹配模式,解構運算式,ref加強等等,
暫時只想起這些,后續會持續更新
,,,,,,,,,,,,,,,,,
參考檔案
Microsoft官方檔案
修改.csproj檔案_從.NET Core將現有.NET專案檔案升級為精益的新CSPROJ格式
.net core 選擇檔案_.net core遷移實踐:專案檔案csproj的轉換
從以前的專案格式遷移到 VS2017 新專案格式
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/299069.html
標籤:.NET技术
上一篇:C#新版本風格專案檔案(SDK風格專案 SDK-style project)
下一篇:C# 給PPT中的圖表添加趨勢線
