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

在VisualStudio中创建NetCore以上版本的项目,使用的都是新版本风格的项目文件。
和旧版本.NetFramework版本的项目文件区别:

  1. 双击项目可直接打开csproj文件进行编辑配置

  2. 项目文件内容的改变

  3. 项目属性文件夹图标更改

  4. 项目引用去除,改成依赖项

  5. Nuget包引用区别

  6. 新版C#语法支持

  7. 多目标框架版本支持

  8. ...

其中最大的区别可以说是引用的改变,
在旧版本的项目文件中,项目所有的引用(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文件需要删除,因为新的项目文件会隐式生成程序集信息,如果需要显示指定,需要配置GenerateAssemblyInfofalse,并且需要使用版本通配符的话还需要配置Deterministicfalse

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 新项目格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱

全世界只有3.14 % 的人关注了爆炸吧知识世上没有精明的买家&#xff0c;只有精明的卖家。的确&#xff0c;卖家的嘴&#xff0c;骗人的鬼。在买与卖的博弈中&#xff0c;没有一个买家可以取胜。别不信&#xff0c;今天就让你见识下“卖家套路终极奥义”。按量定价&#xff0c;是…

东北大姐剪纸被误认为油画,遭人质疑二十多年,只因太过逼真,看完后:真香!不愧是天下第一剪!...

全世界只有3.14 % 的人关注了爆炸吧知识“这是剪纸&#xff1f;太惟妙惟肖了&#xff0c;我还以为是水彩画呢&#xff01;”这是一位网友的留言。茂盛的树木、潺潺的流水……这些栩栩如生的场景&#xff0c;真难想象竟是出自,一双巧手和一把剪刀。这些作品&#xff0c;全部来自…

2021 年 9 月 TIOBE 指数 C# 同比增长突破 1.2%

TIOBE 编程社区指数是编程语言流行程度的指标。该指数每月更新一次。评级基于全球熟练工程师、课程和第三方供应商的数量。谷歌、必应、雅虎、维基百科、亚马逊、YouTube 和百度等流行搜索引擎用于计算评分。C# 近期发展状态不错&#xff0c;依旧在榜单中排第五&#xff0c;但排…

2010年5月系统集成项目管理工程师上午试卷参考答案(讨论版)

鉴于个人精力有限&#xff0c;其他答案将由51CTO相关工作人员不断更新&#xff0c;详见http://training.51cto.com/art/201005/200323.htm以题会友&#xff0c;欢迎跟贴拍砖、讨论。

那些35岁的程序员都去哪了

阅读本文大概需要11分钟。大家好&#xff0c;我是findyi&#xff0c;前段时间写过一篇关于大龄程序员的文章&#xff1a;那些40岁的程序员都去哪了&#xff0c;引发了大家的思考和讨论&#xff0c;不少读者私聊问&#xff1a;除了这些出路&#xff0c;还有没有其他可能&#xf…

Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 二)...

在Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表&#xff08;显示数据一&#xff09;中&#xff0c;解释了如何把Crystal Report整合到Sharepoint2010并把报表数据显示出来&#xff0c;但这样并不完整&#xff0c;因为我们在开发时是以系统帐户进…

那些拧不开瓶盖的女生全都是装的?理工男这样想......

全世界只有3.14 % 的人关注了爆炸吧知识昨天&#xff0c;超模君我正在思考人生&#xff0c;八岁的表妹突然提着一瓶矿泉水站在了我的面前。她可怜兮兮的说&#xff1a;“我想喝水&#xff0c;但是拧不开”。我&#xff1a;“........."超模君我明明亲眼见过她一口气拧开过…

【另类见解】秒杀并非高不可攀

“一提到秒杀很简单这个话题&#xff0c;我知道要被别人鄙视了&#xff1a;你不懂高并发... 这年头开头不画个思维导图都觉得掉价image谈到秒杀&#xff0c;网络上不少于几千片文章&#xff0c;但是大多大同小异。如果你的微信当中关注了几个编程技术类的公众号&#xff0c;我敢…

我又相信爱情了!

1 圣诞限定款的肥宅快乐水更好喝了吗&#xff1f;不&#xff01;更贵了2 周边鬼才&#xff01;这手机壳我爱了3 你以为是个王者&#xff0c;其实是个大脸......4 高温超导材料达到临界温度后能使物体悬浮在不同位置5 火山爆发你见过吗&#xff1f;6 我又相信爱情了&#xff01;…

opencv计算两数组的乘积_#剑指Offer#12. 构建乘积数组

题目描述&#xff1a;给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1]。其中B中的元素B[i]A[0] * A[1]... * A[i-1] * A[i1]... * A[n-1]。不能使用除法。解题思路&#xff1a;首先&#xff0c;仔细理解题意&#xff0c;B[i]是A数组所有元素的乘积&#xff0c;但是没…

记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析

一&#xff1a;背景 1. 讲故事说实话&#xff0c;这篇dump我本来是不准备上一篇文章来解读的&#xff0c;但它有两点深深的感动了我。无数次的听说用 Unity 可做游戏开发&#xff0c;但百闻不如一见。游戏中有很多金庸武侠小说才有的名字&#xff0c;太赏心悦目了。000000df315…

成年人的数学公式

1 成年人的数学公式2 唯一对我说过“别走好吗”的人3 主人发起疯来有多可怕4 别人家的狗看到主人有危险▼你家的……▼5 蜘蛛捕食瞬间6 蜡烛重燃&#xff08;冒的白烟是固态小颗粒的石蜡蒸汽&#xff0c;可燃&#xff09;你点的每个赞&#xff0c;我都认真当成了喜欢

Linux运维实战之DNS的高级配置(转发器、视图等)

上次博文我们具体配置了一台DNS服务器并实现了主辅之间的区域传送&#xff0c;本次博文我们来看看DNS的一些高级配置。 在进行DNS的高级配置之前&#xff0c;必须要理解DNS的原理&#xff08;参见http://sweetpotato.blog.51cto.com/533893/1596973&#xff09; 并且对DNS的基础…

史上最烧脑的学习方法,看完瞬间涨姿势!

▲ 点击查看 在美国&#xff0c;有一个天才儿童计划&#xff0c;选拔一批“天才”儿童进入天才班。这个计划是为了保证每个人接受平等教育机会的同时&#xff0c;也为精英成长提供合适的土壤。美国所谓的天才和精英是怎样的标准呢&#xff1f;进入天才班的儿童首先要通过一个叫…

WPF轮播图实现方式(二)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览02—代码如下一、EmphasizerCarousel.cs 代码如下using System; using System.Collections.Generic; using System.Collections.Obj…

实现链栈的各种基本运算的算法_LeetCode基础算法题第78篇:如何不用加减号实现两数的加法运算?...

一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧&#xff0c;一开始就弄些重量级的&#xff0c;什么人工智能&#xff0c;机器学习的算法&#xff0c;还要有大量的数学以及优化的知识&#xff0c;小白们估计会很郁闷&#xff0c;当然我也不一定能做出来对…

Bootstrap在线编辑器简单分享

Bootstrap 已经使响应式网站开发变得简单很多。 但是如果你不必手动写全部代码&#xff0c;事情会如何呢&#xff1f; 如果你可以自由地选择你想要使用的Bootstrap 组件、并可以把它们拖拽到画布中&#xff0c;事情会如何呢&#xff1f;这就是Bootstrap 编辑器的用武之地。 在这…

爱因斯坦去世不到7个小时,大脑就被人偷走!还被切成240块,供变态医生把玩了几十年.........

全世界只有3.14 % 的人关注了爆炸吧知识你的智商说不定比爱因斯坦还高俗话说&#xff0c;人怕出名猪怕壮。作为世界闻名的大科学家&#xff0c;世人却更愿意把爱因斯坦的成就归功于“天赋异禀的脑子”&#xff0c;顺带着爱因斯坦其他的“身体零件”也都成了大家好奇的对象。爱因…

字符串池化,减少了三分之一的内存占用

字符串池化&#xff0c;减少重复实例&#xff0c;内存降低&#xff0c;一切就是这样的轻松愉快。开篇摘要 本文通过一个简单的业务场景&#xff0c;来描述如何通过字符串池化来减少内存中的重复字符串实例&#xff0c;从而减少内存的占用。在业务中&#xff0c;我们假设如下&am…

启动zookeeper_Giraph源码分析(一)—启动ZooKeeper服务

作者 | 白松Giraph介绍&#xff1a;Apache Giraph is an iterative graph processing system built for high scalability. For example, it is currently used at Facebook to analyze the social graph formed by users and their connections. Giraph originated as the ope…