日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#新版本风格项目文件(SDK风格项目 SDK-style project)

發(fā)布時(shí)間:2023/12/4 C# 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#新版本风格项目文件(SDK风格项目 SDK-style project) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在VisualStudio中創(chuàng)建NetCore以上版本的項(xiàng)目,使用的都是新版本風(fēng)格的項(xiàng)目文件。
和舊版本.NetFramework版本的項(xiàng)目文件區(qū)別:

  • 雙擊項(xiàng)目可直接打開csproj文件進(jìn)行編輯配置

  • 項(xiàng)目文件內(nèi)容的改變

  • 項(xiàng)目屬性文件夾圖標(biāo)更改

  • 項(xiàng)目引用去除,改成依賴項(xiàng)

  • Nuget包引用區(qū)別

  • 新版C#語法支持

  • 多目標(biāo)框架版本支持

  • ...

  • 其中最大的區(qū)別可以說是引用的改變,
    在舊版本的項(xiàng)目文件中,項(xiàng)目所有的引用(dll/nuget/com/項(xiàng)目)全部糅雜在一起(后續(xù)有個(gè)版本會(huì)用圖標(biāo)區(qū)別nuget,但是有bug),對人來說很不友好。
    并且nuget包的引用全部保存在項(xiàng)目的packages.config文件中,但是包還原時(shí)卻是還原在解決方案文件(sln)同目錄的packages目錄下,導(dǎo)致大型項(xiàng)目有多個(gè)解決方案同時(shí)引用一個(gè)項(xiàng)目時(shí)導(dǎo)致包路徑錯(cuò)誤的問題。

    對比如圖,很明顯,新版本的項(xiàng)目文件依賴項(xiàng)更加簡潔明了。

    并且除了依賴項(xiàng),如果你用記事本打開過.csproj文件,你會(huì)發(fā)現(xiàn).NetFramework版本的項(xiàng)目文件內(nèi)容非常多,他把整個(gè)項(xiàng)目的文件引用都記錄在其中,并且還有大量MSBuild相關(guān)的編譯配置等。

    但是在新版風(fēng)格(NetCore)的項(xiàng)目文件中,大大減少,文件默認(rèn)使用文件系統(tǒng)引用,不再顯示記錄在csproj文件中,這樣可以解決以前增刪了代碼文件而沒提交項(xiàng)目文件導(dǎo)致的編譯錯(cuò)誤,并且使得項(xiàng)目文件可以很容易的手動(dòng)修改各種配置。

    各種優(yōu)點(diǎn)都說完了,但是很多人會(huì)疑問,這是NetCore風(fēng)格的項(xiàng)目文件,并不是所有.NetFramework的項(xiàng)目都可以升級為Core,無須擔(dān)心,即使是.NetFramework也可以使用新版的項(xiàng)目文件,只需要安裝了NetCore或者更高版本的SDK就行,最后編譯出來的程序集并不需要依賴NetCore的Runtime。
    并且新版本的項(xiàng)目文件支持多目標(biāo)框架版本,一個(gè)項(xiàng)目即可編譯出多個(gè)目標(biāo)框架版本的程序集,

    如何遷移

    如果是簡單的項(xiàng)目,沒有各種騷操作,直接新建一個(gè)NetCore的項(xiàng)目,把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文件沖突

    注意默認(rèn)的AssemblyInfo文件需要?jiǎng)h除,因?yàn)樾碌捻?xiàng)目文件會(huì)隱式生成程序集信息,如果需要顯示指定,需要配置GenerateAssemblyInfo為false,并且需要使用版本通配符的話還需要配置Deterministic為false。

    2. Nuget引用方式

    nuget引用需要從package.config遷移到項(xiàng)目文件的PackageReference節(jié)點(diǎn)。

    2. 生成路徑帶有版本框架的文件夾

    .NetFramework的項(xiàng)目默認(rèn)生成路徑為bin/Debug,但是Core之后會(huì)再加一層框架版本文件夾,這是因?yàn)樾掳姹镜捻?xiàng)目文件支持多目標(biāo)框架版本,如果不需要這層文件夾只要修改AppendTargetFrameworkToOutputPath配置為false即可。

    3. 使用多版本目標(biāo)框架

    NetCore風(fēng)格的項(xiàng)目文件支持多目標(biāo)框架版本,就是一個(gè)項(xiàng)目可以生成多個(gè)目標(biāo)框架版本的程序集,而不需要?jiǎng)?chuàng)建多個(gè)項(xiàng)目,該功能只需要把原本的TargetFramework節(jié)點(diǎn)修改成TargetFrameworks就行,使用分號分隔框架版本,例如<TargetFrameworks>net40;netcoreapp2.1;netcoreapp3.1;net5.0;net5.0-windows</TargetFrameworks>。

    4. 項(xiàng)目構(gòu)建時(shí)自動(dòng)生成nuget包

    NetCore風(fēng)格的項(xiàng)目文件只需配置好包信息,可以在每次構(gòu)建時(shí)自動(dòng)生成Nuget包,并且會(huì)根據(jù)項(xiàng)目依賴自動(dòng)生成包依賴,無須手動(dòng)編寫nuspec文件,更多配置可參考官方文檔。也可參照我的實(shí)例

    <!--自動(dòng)生成Nuget包--><GeneratePackageOnBuild>true</GeneratePackageOnBuild><!--生成項(xiàng)目Xml文檔(包)--><GenerateDocumentationFile>true</GenerateDocumentationFile><!--調(diào)試符號文件嵌入到dll中,以便附加調(diào)試nuget包程序(項(xiàng)目生成nuget包默認(rèn)不含pdb文件,想要調(diào)試需要用符號包或者下面方式)--><!-- 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編譯帶資源文件的項(xiàng)目

    如果是Winform或在WPF項(xiàng)目,大概率會(huì)有資源文件,如果使用vs功能菜單生成則沒有此問題,但是使用dotent cli進(jìn)行編譯則會(huì)出現(xiàn)以下錯(cuò)誤,但是這是NetCore項(xiàng)目才會(huì)出現(xiàn)的問題和處理方式,目前暫時(shí)不知道有什么解決方法,由于沒有CI/CD的需求,也就沒有過多深究了。

    C:\Program Files\dotnet\sdk\5.0.400\Microsoft.Common.CurrentVersion.targets(3162,5): error MSB3823: 非字符串資源要求將屬性 GenerateResourceUsePreserializedResources 設(shè)置為 true。 [E:\xxxx.csproj] C:\Program Files\dotnet\sdk\5.0.400\Microsoft.Common.CurrentVersion.targets(3162,5): error MSB3822: 非字符串資源要求在運(yùn)行時(shí)使用 System.Resources.Extensions 程序集,但未在此項(xiàng)目的引用中找到它。 [E:\xxxx.csproj]
    6. 低版本框架使用高版本C#語法

    .NetFramework的項(xiàng)目最高只能支持C#7.3(貌似?不太記得了),許多C#8/C#9以及即將發(fā)布的C#10的新特性無法使用,升級后如果不指定會(huì)默認(rèn)支持框架版本兼容的C#版本,但是可以手動(dòng)配置項(xiàng)目項(xiàng)目的LangVersion指定使用相應(yīng)版本的C#。除了一些需要框架支持的新特性,大部分語法特性都可以支持。例如單行using,switch表達(dá)式,頂級語句,init關(guān)鍵字,匹配模式,解構(gòu)表達(dá)式,ref加強(qiáng)等等。

    暫時(shí)只想起這些,后續(xù)會(huì)持續(xù)更新
    。。。。。。。。。。。。。。。。。

    參考文檔

    Microsoft官方文檔

    修改.csproj文件_從.NET Core將現(xiàn)有.NET項(xiàng)目文件升級為精益的新CSPROJ格式

    .net core 選擇文件_.net core遷移實(shí)踐:項(xiàng)目文件csproj的轉(zhuǎn)換

    從以前的項(xiàng)目格式遷移到 VS2017 新項(xiàng)目格式

    總結(jié)

    以上是生活随笔為你收集整理的C#新版本风格项目文件(SDK风格项目 SDK-style project)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。