手把手教会将 Windows 窗体桌面应用从.NET Framework迁移到 .NET SDK/.NET 6 格式
接上篇:手把手教会 VS2022 设计 Winform 高DPI兼容程序 (net461 net6.0 双出) https://www.cnblogs.com/densen2014/p/16142939.html
本文介绍如何将 Windows 窗体桌面应用从 .NET Framework 迁移到 .NET SDK 格式或 .NET 6 或更高版本。 .NET SDK 支持 Windows 窗体应用程序。 Windows 窗体仍是仅适用于 Windows 的框架,并且只能在 Windows 上运行。
将应用从 .NET Framework 迁移到 .NET SDK 格式或 .NET 6 通常需要一个新的项目文件。 NET 6 使用 SDK 样式的项目文件,而 .NET Framework 通常使用较旧的 Visual Studio 项目文件。 如果你曾经在文本编辑器中打开过 Visual Studio 项目文件,你就会知道它有多么详细。 SDK 样式的项目较小,不需要像旧版项目文件格式那样多的条目。
备份项目
迁移项目的第一步是备份项目! 如果出现问题,可以通过还原备份将代码还原为其原始状态。 不要依赖于 .NET 可移植性分析器等工具来备份项目,即使它们似乎可以完成备份。 最好是亲自创建原始项目的副本。
卸载工程,编辑项目文件
剪切所有内容到记事本.添加空白项目文件
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- 选一种自己需要的方式 -->
<TargetFramework>net6.0-windows</TargetFramework>
<TargetFramework>net461</TargetFramework>
<TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>
<!-- 如果是库,这句直接删除,库不需要定义 <OutputType> 设置-->
<OutputType>WinExe</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
</Project>
<RootNamespace>FreeRes2019</RootNamespace>
<AssemblyName>FreeRes2019</AssemblyName>
节点
所有的 <PropertyGroup>单独节点内容 直接全部复制到新项目 <PropertyGroup> 下面
例如
<PropertyGroup>
<RootNamespace>Freexxx2019</RootNamespace>
<AssemblyName>Freexxx2019</AssemblyName>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>false</GenerateManifests>
</PropertyGroup>
复制到
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- 选一种自己需要的方式 -->
<TargetFramework>net6.0-windows</TargetFramework>
<TargetFramework>net461</TargetFramework>
<TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>
<!-- 如果是库,这句直接删除,库不需要定义 <OutputType> 设置-->
<OutputType>WinExe</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms>
<!-- 复制到这里 -->
<RootNamespace>Freexxx2019</RootNamespace>
<AssemblyName>Freexxx2019</AssemblyName>
<GenerateManifests>false</GenerateManifests>
</PropertyGroup>
</Project>
引用升级
对于这种直接复制到新项目文件即可
<Content Include="TSCLIB.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Reference Include 升级
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
新版
<ItemGroup>
<Import Include="System" />
<Import Include="System.Core" />
<Import Include="System.Xml.Linq" />
<Import Include="System.Data.DataSetExtensions" />
<Import Include="Microsoft.CSharp" />
<Import Include="System.Data" />
<Import Include="System.Net.Http" />
<Import Include="System.Xml" />
</ItemGroup>
工程引用
删除 Project 和 Name节点复制过去
<ItemGroup>
<ProjectReference Include="..\AME.FreeRes\AME.FreeRes.csproj">
<Project>{bd216839-c870-4b5a-b3e3-46bd5f7d8d6d}</Project>
<Name>AME.FreeRes</Name>
</ProjectReference>
</ItemGroup>
复制为
<ItemGroup>
<ProjectReference Include="..\AME.FreeRes\AME.FreeRes.csproj" />
</ItemGroup>
Compile 一般不需要复制
<ItemGroup>
<Compile Include="Attribute\Attribute.cs" />
<Compile Include="DataTableBase.cs" />
...
</ItemGroup>
NuGet 包
如果项目引用了 NuGet 包,则项目文件夹中可能包含 packages.config 文件。 对于 SDK 样式的项目,NuGet 包引用是在项目文件中配置的。 Visual Studio 项目文件也可以选择在项目文件中定义 NuGet 包。 .NET 6 不会将 packages.config 用于 NuGet 包。 在迁移之前,必须将 NuGet 包引用迁移到项目文件中。
<ItemGroup>
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
</ItemGroup>
改为
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
要迁移 packages.config 文件,请执行以下步骤:
- 在“解决方案资源管理器”中,找到要迁移的项目。
- 右键单击“packages.config”>“将 packages.config 迁移到 PackageReference”。
- 选择所有顶级包。
- 系统会生成一个生成报告,让你知道与迁移 NuGet 包有关的任何问题。
库不需要定义 设置。 如果要升级库项目,请删除该条目。
重载项目
将项目转换为新的 SDK 样式格式后,请在 Visual Studio 中重载项目:
在“解决方案资源管理器”中,找到要转换的项目。
右键单击项目,选择“重载项目”。
如果项目加载失败,则可能是因为在项目的 XML 中引入了一个错误。 打开项目文件以进行编辑,并尝试识别和修复错误。 如果找不到错误,请尝试重启。
编辑 App.config
如果你的应用包含 app.config 文件,则删除 元素:
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
对于 App.config 文件,有一些事项需要考虑。 .NET Framework 中的 App.config 文件不仅用于配置应用,还用于配置运行时设置和行为,如日志记录。 .NET 6(和 .NET Core)中的 App.config 文件不再用于运行时配置。 如果 App.config 文件包含这些部分,则不会考虑这些部分。
实际项目
升级完成后,迁移的 Windows 窗体项目将类似于以下 XML:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- 选一种自己需要的方式 -->
<TargetFramework>net6.0-windows</TargetFramework>
<TargetFramework>net461</TargetFramework>
<TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>
<!-- 如果是库,这句直接删除,库不需要定义 <OutputType> 设置-->
<OutputType>WinExe</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\MatchingGame.Logic\MatchingGame.Logic.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MetroFramework" Version="1.2.0.3" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.3.261602">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Windows.Compatibility" Version="6.0.0" />
</ItemGroup>
</Project>
我自己的工程,升级项目文件后后,精简了不少

参考资料
https://docs.microsoft.com/zh-cn/dotnet/core/porting/upgrade-assistant-winforms-framework
https://docs.microsoft.com/zh-cn/dotnet/desktop/winforms/migration/?view=netdesktop-6.0
手把手教会将 Windows 窗体桌面应用从.NET Framework迁移到 .NET SDK/.NET 6 格式的更多相关文章
- 在.NET Core 3.0 Preview上使用Windows窗体设计器
支持使用基于Windows窗体应用程序的.NET Core 3.0(预览)的Windows窗体设计器 介绍 截至撰写本文时,Microsoft和社区目前正在测试.NET Core 3.0.如果您在.N ...
- 如何给windows窗体程序打包成一个安装包
http://blog.csdn.net/xyy410874116/article/details/6341787 给windows窗体程序打包成一个安装包:具体操作在:http://hi.baidu ...
- c#实现windows远程桌面连接程序
c#实现windows远程桌面连接程序 使用winform制作windows远程桌面连接程序,windows自带了远程桌面连接,我们需要将远程桌面连接集成 到自己的winform程序,并实现管理远程主 ...
- 演练:调试 Windows 窗体
Windows 窗体是最常见的托管应用程序之一. Windows 窗体创建标准的 Windows 应用程序. 你可以完成此演练使用 Visual Basic 中, C#,或 c + +. 首先,您必须 ...
- c#实现windows远程桌面连接程序代码
使用winform制作windows远程桌面连接程序,windows自带了远程桌面连接,我们需要将远程桌面连接集成 到自己的winform程序,并实现管理远程主机的配置. 远程桌面核心类库 windo ...
- 使用WIN32汇编语言实现一个基本windows窗体的过程分析
一个常规的windows窗体一般都是一些一样的构造.你假设想要更改一些个性化的设置,你能够在这个一般的模板伤添砖加瓦.构造自己比較喜欢的类型.下边就分析一下一般的windows窗体的一般模板. 一. ...
- 如何:对 Windows 窗体控件进行线程安全调用
http://msdn.microsoft.com/zh-cn/library/ms171728(VS.90).aspx http://msdn.microsoft.com/zh-cn/library ...
- C#学习笔记-Windows窗体基本功能(Login登录界面)
本菜鸟由于实习工作的原因,不得不快速接触C#语言,刚刚好又要做毕业设计,所以就通过自学的方式一举两得地完成这两件事情. 故此文字记录或代码中的各种文件名之类均是以毕业设计为模版记录的,看着不方便之处请 ...
- 用于列出选项的Windows窗体控件
可以提供选项列表的控件有ListBox.ComboBox.CheckedListBox,如何正确的使用和选择这些控件,下面对此进行讨论.首先对这三种控件的功能分别进行说明: ListBox ListB ...
随机推荐
- 内网渗透----windows信息收集整理
一.基础信息收集 1.信息收集类型 操作系统版本.内核.架构 是否在虚拟化环境中,已安装的程序.补丁 网络配置及连接 防火墙设置 用户信息.历史纪录(浏览器.登陆密码) 共享信息.敏感文件.缓存信息. ...
- 如何运行MATLAB和C++混合编程
在GitHub下载了一个大佬的滤波器程序,包含MATLAB和C++,刚开始直接运行,发现提示如下: 然后,第一步:点击截图访问后面的链接,跳转到如下截图: 第二步:点击上面截图的左下角,R2015b版 ...
- Python通过snap7库与西门子S7-1200建立S7通信,读写存储器数据,顺便写个流水灯
1.snap7 简介 snap7 是一个基于以太网与S7系列的西门子PLC通讯的开源库. 支持包括S7系列的S7-200.S7-200 Smart.S7-300.S7-400.S7-1200以及S7- ...
- Linux磁盘分区管理-LVM回顾
LVM(逻辑分区管理)的几个概念:PV(物理卷),VG(卷组),LV(逻辑卷),PE(物理区域),LE(逻辑区域),其中PV, VG, LV 三者之间的关系如下图 : 物理存储介质:这里指系统的存储设 ...
- 【推理引擎】ONNXRuntime 的架构设计
ONNXRuntime,深度学习领域的神经网络模型推理框架,从名字中可以看出它和 ONNX 的关系:以 ONNX 模型作为中间表达(IR)的运行时(Runtime). 本文许多内容翻译于官方文档:ht ...
- Collection框架中实现比较要实现什么接口?
Java集合框架中需要比较大小的集合包括TreeMap.TreeSet,其中TreeMap会根据key-value对中key的大小进行排序,而TreeSet则会对集合元素进行排序. 因此TreeMap ...
- mysql问题排查与性能优化
MySQL 问题排查都有哪些手段? 使用 show processlist 命令查看当前所有连接信息. 使用 explain 命令查询 SQL 语句执行计划. 开启慢查询日志,查看慢查询的 SQL. ...
- 编译器如何处理C++不同类中同名函数(参数类型个数都相同)
转载请注明出处,版权归作者所有 lyzaily@126.com yanzhong.lee 作者按: 从这篇文章中,我们主要会认识到一下几点: 一.不类中的特征标相同的同名函数,它们是不同的函数,原因就 ...
- C++ | 虚函数初探
虚函数 虚函数 是在基类中使用关键字 virtual 声明的函数.在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数. 我们想要的是在程序中任意点可以根据所调用的对象类型来选择调 ...
- H.265
Baseline支持I/P 帧,只支持无交错(Progressive)和CAVLC一般用于低阶或需要额外容错的应用,比如视频通话.手机视频等: Main支持I/P/B 帧,无交错(Progressiv ...