Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.net core迁移实践:项目文件csproj的转换

.net core迁移实践:项目文件csproj的转换

作者头像
梁规晓
发布于 2020-11-05 02:38:37
发布于 2020-11-05 02:38:37
1.5K00
代码可运行
举报
文章被收录于专栏:DotNet程序园DotNet程序园
运行总次数:0
代码可运行

随着net core的不断更新和生产可用,越来越多的人把现有的应用迁移和部署到net core平台。本文将分享迁移过程中的一个环节,给大家做一下参考。

背景说明

先来介绍一下什么是SDK样式的文件结构。关注net core发展的同学应该对早期的项目定义文件project.json还有点印象。

.net开发组在net core 1.0版本时是准备抛弃xml格式的csproj文件而改为json格式的project.json来定义和描述项目的。

但是后来主要由于MSBuild的兼容问题,不得不放弃project.json转移回xml格式的csproj(详见https://devblogs.microsoft.com/dotnet/announcing-net-core-tools-msbuild-alpha/)。

然而由于传统.net framework的csproj文件内容繁杂,可读性和操作性较差,因此微软重新定义了新样式的csproj文件内容样式。

其最大化的保持了和原有xml属性的兼容,并添加了一些新的特性。由于新格式的csproj文件总是以:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project Sdk="Microsoft.NET.Sdk"></Project>

标记来定义,所以称之为SDK样式。

一个典型的.net framework平台的csproj文件结构如下图所示:

其中包含了项目的编译配置、调试生成配置、大量的nuget文件依赖、大量的cs源代码文件路径等,造成了此文件内容的非常繁多,阅读和分析都有比较大的困难。

而SDK样式的csproj文件内容就非常精简了,如下图所示:

其中TargetFrameworks配置项目的多目标平台,可选的值有netstandard2.1;net451;netcoreapp3.1,三种格式分别代表net standard、net framework、net core目标平台。

此处的配置根据各人的项目定位不同设置所需的值。我们公司的业务程序是跑在特定的运行容器下的,迁移过程也是分阶段展开,最终我们采取先同时编译两个目标平台dll的方案。

由以上对比可见,SDK样式的csproj内容精简的一大原因就是文件的依赖(cs源码和nuget包文件)不需要在csproj中明确写明。

针对cs源码及目录结构,VS自动识别项目目录内的文件结构作为项目结构,这一点改变真是点赞。

因为文件及目录不需要csproj这个中间层再多一次描述,相当于“所见即所得”,相信大家在平时肯定遇到磁盘的源文件存在而VS项目就是看不到等类似问题,以后不会再有困惑啦。

另外针对nuget包依赖的文件也是如此,csproj不再维护nuget包内的文件明细,而改为PackageReference以nuget包为单位来管理依赖。

这个改变对我们的转换几乎没有影响,重新添加一次nuget引用即可;

同时再说一句:net core是不支持packages.config文件管理nguet包,建议大家提前就将nuget包的管理改为PackageReference方式;

csproj文件转换的操作步骤

有了以上的背景说明,接下来的工作就是针对要迁移的项目csproj文件执行改造,其实微软也提供了一些辅助工具(dotnet try-convert等)来帮助迁移。

但是必须先保证迁移操作明确和无误后,才能逐步使用特定的辅助工具来提高效率。具体操作如下:

1. 直接备份原csproj文件然后将其清空
2. 然后粘贴如下最小化的xml代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.1;net451</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
</Project>
3. 调整的依赖nuget包和直接引用的程序集dll

这一步对nuget包有要求,需要其提供netstandard平台的版本,如下图:

如果是公司内部的nuget包就需要提前做好支持,而如果是依赖的第三方nguet包那就需要确认是否有net core支持了。

不过当前net core已成趋势,绝大多数流行的nuget包都能够支持了。

4. 检查和处理源代码中不兼容的部分

由于从.net framework迁移到.net core确实存在部分代码不兼容的地方,因此需要一一识别并寻找替代方案。

微软官方提供了不兼容说明,大家可以参考本文末尾的链接【从 .NET Framework 迁移到 .NET Core 的中断性变更】。

这里提供几种常见的不兼容情况:

  1. CallContext不兼容:可以通过Asynclocal 替换解决。
  2. 原System.ComponentModel.DataAnnotations不兼容:需要单独安装nuget包System.ComponentModel.Annotations即可解决。
  3. System.Runtime.Remoting不兼容:暂无替换方案
5. 删除:Properties文件夹的AssemblyInfo.cs
6. 删除:packages.config文件。
7. 提醒:调整CI配置

输出目录Debug/Release目录内也分别生成了netstandard2.1和net451的2套程序集。因此假如应用了CI的话,相关设置也需要更新。

完成以上操作后,项目的结构就变成了下图的样子,这样编译通过后会生成针对特定目标平台的程序集。

总结

本文首先介绍了SDK样式的csproj文件的背景,并详细介绍了从传统.net framework项目转换到net core项目的关键步骤。

根据各企业的项目规模和应用场景的不同,还需要制订合理的迁移计划,配合严格的测试工作,这样才能保证迁移工作的稳定推进,尤其要避免的是因迁移net core而带来服务异常甚至是生产事故。

祝大家迁移顺利!

参考资料

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.NET Core迁移前的准备工作
从 .NET Framework 迁移到 .NET Core 的中断性变更
从 packages.config 迁移到 PackageReference
从 .NET Framework 移植到 .NET Core 的概述
.NET可移植性分- 析器
.NET API 分析器
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet程序园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
理解 C# 项目 csproj 文件格式的本质和编译流程
发布于 2018-05-10 00:13 更新于 2018-08-12 08:11
walterlv
2018/09/18
3K0
理解 C# 项目 csproj 文件格式的本质和编译流程
自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference
发布于 2018-04-24 10:03 更新于 2018-06-29 08:52
walterlv
2018/09/18
1.9K0
自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
2018-06-20 01:22
walterlv
2018/09/18
1.1K0
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
.NET Core爬坑记 1.0 项目文件
  之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的、有API方面的,今天要讲的是编译方面的一些问题。我把它们整理后分享出来,以便各位博友不要再遇到这些坑。
yoyofx
2018/09/05
4590
将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF;同时还发布了 Visual Studio 2019 预览版。你可以基于 .NET Core 3 创建 WPF 程序。不过,如果你已经有基于 .NET Framework 的 WPF 项目,那么如何快速迁移到基于 .NET Core 的版本呢?
walterlv
2023/10/22
4970
将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
拥抱.NET Core,如何开发一个跨平台类库 (1)
在此前的文章中详细介绍了使用.NET Core的基本知识,如果还没有看,可以先去了解“拥抱.NET Core,学习.NET Core的基础知识补遗”,以便接下来的阅读。
落跑架构师M
2020/02/11
7310
拥抱.NET Core,如何开发一个跨平台类库 (1)
.Net Core迁移到MSBuild平台(二)
在上一篇文章.Net Core迁移到MSBuild的多平台编译问题中,简单的讲了下新的项目配置文件中的节点配置,这篇我将用一些例子来详细讲下从project.json迁移到msbuild过程的节点配置。做过完整迁移新项目配置文件的朋友,肯定会觉得新的项目配置文件Msbuild的配置太扯了,虽然能直接编辑项目文件,但整个配置文件中没有了像project.json中的智能提示,当你在打开文件后你就会发现以前很轻松能写出来的json配置,现在已经什么都写不出来了,而且也没有文档可以参考,一般的情况下,往往开发人员就会关掉项目文件,打开NuGet管理器来进行包引用,但是这真的够用吗?不是所有的配置都能用可视化的方法来完成。
yoyofx
2018/09/05
1.9K0
.Net Core迁移到MSBuild的多平台编译问题
  本篇主要讨论.NET Core应用程序项目结构的主题,重点探索.NET Core应用程序的多平台编译问题,这里指的多平台是指.NET Framework、.NET Core App、.NET Standard、Mono、UWP等多平台的条件编译、项目(包)引用、编译符号等问题。
yoyofx
2018/09/05
9460
将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj
发布于 2018-01-15 16:04 更新于 2018-09-07 04:40
walterlv
2018/09/18
1.7K0
将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj
微软官方的 NuGet 包是如何做到同时兼容新旧框架的?例如 System.ValueTuple 是如何做到在新旧版本的框架都能使用的?
不知你是否好奇,System.ValueTuple 是新框架(.NET Core 3.0)开始引入的类型,但可以通过 NuGet 包向旧框架提供这些类型的使用。并且,这些包即便安装到本来就有此类型的新框架上也能正常运行而不会出现多处类型定义的问题。
walterlv
2023/10/22
6780
微软官方的 NuGet 包是如何做到同时兼容新旧框架的?例如 System.ValueTuple 是如何做到在新旧版本的框架都能使用的?
基于.net core实现项目自动编译、并生成nuget包
      近期想对自己的项目增加自动编译并生成nuget包,网上资料不少。但总还有迷糊的时候。首先:此解决方案包含多种版本的项目,如:有编译必须是x86平台,以及还有传统的.net foramework项目,以及多版本的.net core项目等。找到通用的解决方案还是用了不少的时间。本文章就对此做下自我总结。望对同仁有所帮助。 一、遇到的问题,以及解决办法 1.1 不同平台的编译怎么办       .net可以将dll(或者说是项目)编译成x86、x64、anycpu 等至少三种平台代码。但如果用dotn
sam dragon
2018/05/28
1.7K0
项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦)
发布于 2018-04-12 13:03 更新于 2018-08-29 01:36
walterlv
2018/09/18
1.8K0
让一个 csproj 项目指定多个开发框架
发布于 2018-01-21 03:28 更新于 2018-08-31 09:56
walterlv
2018/09/18
1.1K0
让一个 csproj 项目指定多个开发框架
C#/.NET 如何创建带有本机依赖的多框架多系统 NuGet 包
正常如果你想写一个 .NET 的 NuGet 包,直接打包就好了,你的引用程序集会出现在 NuGet 包内的 lib 文件夹内。然而,如果我们的 NuGet 包包含本机依赖的话怎么办呢?
walterlv
2023/10/23
1.3K0
C#/.NET 如何创建带有本机依赖的多框架多系统 NuGet 包
.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结
本文主要是关于.NET Standard 代码 在多框架 和 多平台 支持自己实践过程中遇到的一些问题和解决办法,希望给遇到这些问题的同学一点参考和思路。问题基本上都是提在 博问 和 Stackoverflow 中,不乏很多大佬都提供了解决问题的思路。接下来则是正文。
AI.NET 极客圈
2019/07/19
2.4K0
.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结
SourceYard 制作源代码包 控制台项目WPF 程序调试
本文带大家走进SourceYard开发之旅 在项目开发中,将一个大的项目拆为多个小项目解耦,减少模块之间的耦合。因为如果将代码放在一起,即使有团队的约束,但只要能写出的代码就会有小伙伴写出,很快就发现各个模块耦合的代码很多。但是对一个项目的拆分会让拆分出来的每一个项目都编译出一个 dll 增加运行文件的启动时间。 在开发中,常常会用到很多工具类,这些小轮子很多的功能基本就只有一个类,如何对这些小轮子进行管理?通过复制代码还是通过 Nuget 管理?
林德熙
2019/03/13
1.2K0
SourceYard 制作源代码包
            控制台项目WPF 程序调试
.NET Standard中配置TargetFrameworks输出多版本类库
在.NET Standard/.NET Core技术出现之前,编写一个类库项目(暂且称为基础通用类库PA)且需要支持不同 .NET Framework 版本,那么可行的办法就是创建多个不同版本的项目(暂且称为PB1、PB2、PB3 ... PBn)。PB1、PB2、PB3 ... PBn项目分别执行下面操作:【添加】--【现有项】--【添加为链接的方式】,将PA项目代码文件添加到各自项目中,如果代码不同,则需要使用#if #else #endif 等标签来判断 .NET Framework 版本。而在.NET Standard/.NET Core技术出现之后,可以通过配置SDK 样式项目中的目标框架来支持一套代码同时输出多版本类库。
张传宁IT讲堂
2020/10/19
3.4K0
删删删!快速将旧版 .NET Framework 的 WPF / Windows Forms 项目格式(csproj) 迁移成新版 SDK 风格的项目格式
现在再使用 Visual Studio 创建新的 WPF 项目时,将默认引诱你使用 .NET 6(或者 5、.NET Core 3.1)框架和配套的新的 SDK 风格的项目文件(csproj)。
walterlv
2023/10/23
8840
删删删!快速将旧版 .NET Framework 的 WPF / Windows Forms 项目格式(csproj) 迁移成新版 SDK 风格的项目格式
Magicodes.IE编写多框架版本支持和执行单元测试
很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE就出现了以下问题:
心莱科技雪雁
2019/12/12
6800
Magicodes.IE编写多框架版本支持和执行单元测试
.NET Core中的包、元包与框架
.NET Core是一个由NuGet包组成的平台。一些产品受益于细粒度包的定义,也有一些受益于粗粒度包的定义。为了适应这种二重性,.NET Core平台被分为一组细粒度的包(package)以及一些被称为元包(metapackage)的较粗粒度的包。
雪飞鸿
2018/09/05
1.2K0
.NET Core中的包、元包与框架
推荐阅读
理解 C# 项目 csproj 文件格式的本质和编译流程
3K0
自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference
1.9K0
将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
1.1K0
.NET Core爬坑记 1.0 项目文件
4590
将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
4970
拥抱.NET Core,如何开发一个跨平台类库 (1)
7310
.Net Core迁移到MSBuild平台(二)
1.9K0
.Net Core迁移到MSBuild的多平台编译问题
9460
将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj
1.7K0
微软官方的 NuGet 包是如何做到同时兼容新旧框架的?例如 System.ValueTuple 是如何做到在新旧版本的框架都能使用的?
6780
基于.net core实现项目自动编译、并生成nuget包
1.7K0
项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦)
1.8K0
让一个 csproj 项目指定多个开发框架
1.1K0
C#/.NET 如何创建带有本机依赖的多框架多系统 NuGet 包
1.3K0
.NET Core 多框架支持(net45+netstandard20)实践中遇到的一些问题总结
2.4K0
SourceYard 制作源代码包 控制台项目WPF 程序调试
1.2K0
.NET Standard中配置TargetFrameworks输出多版本类库
3.4K0
删删删!快速将旧版 .NET Framework 的 WPF / Windows Forms 项目格式(csproj) 迁移成新版 SDK 风格的项目格式
8840
Magicodes.IE编写多框架版本支持和执行单元测试
6800
.NET Core中的包、元包与框架
1.2K0
相关推荐
理解 C# 项目 csproj 文件格式的本质和编译流程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验