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;是…

python 接口自动化_Python 接口自动化测试

1. 接口基础知识1.1 接口分类接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。(1) webservice接口&#xff1a;走soap协议通过http传输&#xff0c;请求报文和返回报文都是xml格式的&#xff0c;我们在测试的时候都要通过工具才能进行调…

工厂模式 Factory

工厂模式 记得一个好友面试的时候&#xff0c;面试官问他&#xff0c;你怎么获得一个类的对象的好友说&#xff0c;new一个啊&#xff0c;的确没错&#xff0c;对象不是new难道还是create... 当然在使用new对象的时候&#xff0c;这段代码也就意味着难以以后的维护和扩展了&…

java定时器写法_java定时器的写法是什么样?

定时器的用法是java核心基础之一&#xff0c;很多特殊功能都需要用到定时器&#xff0c;下面一起来看看定时器是如何编写的吧。示例&#xff1a;一个具备周期性定时(毫秒级);单时刻定时(秒级);多时刻定时(秒级)。后两个时间的设置必须符合“yyyy-MM-ddHH:mm:ss”、“yyyy-MM-dd…

CentOS中vsftp安装、配置、卸载

CentOS中vsftp安装、配置、卸载转载http://www.zjgsq.com/1509.html转载于:https://blog.51cto.com/bbtao/1606816

struts2文件上传

/*** 单文件的上传* author Administrator**/public class FileUploadAction extends ActionSupport {private static final com.opensymphony.xwork2.util.logging.Logger logger LoggerFactory.getLogger(FileUploadAction.class);//上传文件private File upload;//保存路径…

python的所有库_Python 常用库

前言之前重写了视频字符画处理的代码&#xff0c;然后这两天又在研究命令行和网络。读了一点开源工具的代码&#xff0c;越来越觉得有必要针对性地学习一下一些重要的基础库。这里呢就列个小清单&#xff0c;把我认为有必要学习的库写一下。带 [ x ] 的表示已完成时间time&…

401 Palindrome

这道题最初我是没理解清楚题意,我以为那些reverse栏空白的字母是省略了.后来在这个论坛找到了更多的测试数据,发现了自己理解错了,重新读题 ,修改了下代码- -.弄了很久才AC 我的思路和别人有点不同的是,我是通过计算来得到在常量表中的位置 好吧 这道题本来该总结很多的,今天…

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

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

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

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

java基础面向对象_java基础面向对象

一、面向对象之封装1. 面向对象的三个特征是&#xff1a;封装、继承和多态。2. Java开发过程&#xff1a;要实现某个功能&#xff0c;首先要找能够实现这个功能的对象&#xff0c;如果没有找到&#xff0c;就自己造一个对象&#xff0c;将要实现的功能定义到对象中&#xff0c;…

linux 学习笔记 显示压缩文件 gong.zip 的文件内容

#zip -v gong zip zip info: xxx >删除压缩文件中俄smart.txt 文件 #zip -d gong.zip smart.txt deleting:smart.txt >向压缩文件中gong.zip中添加rpm_info.txt文件 #zip -m gong.zip ./rpm_info.txt adding:rpm_info.txt deflated 79% Unzip命令解压缩文件 >将gong.z…

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

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

python qt信号在qml 的使用_QML与Python通信

对于Python3和QML通信&#xff0c;实际上就是 PyQt5QMLPython3混合编程&#xff0c;这是必须的&#xff0c;因为QML做图形界面比较容易&#xff0c;但是做功能实现就用Python比较好&#xff0c;虽然QML也能嵌入 JavaScript代码进行实现&#xff0c;但是这样话还不如用Python来实…

那些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;“........."超模君我明明亲眼见过她一口气拧开过…

java 代码同步_Java同步代码块 转

Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容&#xff1a;Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java同步关键字(synchronized)Java中的同步块用s…

Office 2010 64位版本

最新的Office 2010有了x86和x64两种不同的版本&#xff0c;众所周知的使用x64版本具有可以支持更大的内存等特点&#xff0c;但是也会出现一定的兼容性问题。其中感觉影响比较大的是Access的32位版本和64位版本创建的数据库无法通用&#xff0c;这样以前创建的Access文件就无法…

JUnit 测试

Junit 使用 1、忽略测试方法。在使用Test的方法上使用Ignore&#xff0c;将不会对此方法进行测试 2、测试套件 解决的问题&#xff1a; 1、对测试类进行统一测试&#xff0c;而不必在单独测试类上一个一个进行测试。 使用JUnit的RunWith以及SuiteClassses注解&#xff0c;Suite…