接上篇:手把手教会 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>

工程引用

删除 ProjectName节点复制过去

  <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 文件,请执行以下步骤:
  1. 在“解决方案资源管理器”中,找到要迁移的项目。
  2. 右键单击“packages.config”>“将 packages.config 迁移到 PackageReference”。
  3. 选择所有顶级包。
  4. 系统会生成一个生成报告,让你知道与迁移 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

最新文章

  1. Java并发之原子变量和原子引用与volatile
  2. 向maven中央仓库提交jar
  3. 【leetcode】Next Permutation(middle)
  4. Linux下各个目录的作用
  5. 如何使用SQL Server链接服务器访问DB2 Server
  6. 防火墙没关导致 ORA-12541: TNS: 无监听程序
  7. 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)
  8. Android使用百度定位SDK 方法及错误处理
  9. poj 2325 Persistent Numbers (贪心+高精度)
  10. Delphi应用程序的调试(十)调试器选项(在IDE中不要使用异常)
  11. UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)
  12. java复习要点(一)------- java语言的特点、java的工作原理、配置环境变量、java命令的使用
  13. hashlib 模块
  14. TCP/IP 和 HTTP 的区别和联系是什么?
  15. tensorflow 笔记11:tf.nn.dropout() 的使用
  16. 「版本升级」MyEclipse CI 2018.12.0正式发布
  17. EF 更新实体 The instance of entity type &#39;BabyEvent&#39; cannot be tracked because another instance
  18. apache kafka系列之Producer处理逻辑
  19. Python序列化和反序列化vsJSON
  20. git 删除追踪状态

热门文章

  1. Django1.11 添加markdown语法支持
  2. systemd --user进程CPU占用高问题分析
  3. POI完成Excel文件的读和写
  4. 从文件下载视角来理解Web API
  5. centos配置ssh服务并简单测试
  6. 为什么要用 Spring Boot?
  7. nginx使用与配置
  8. 在 Spring AOP 中,关注点和横切关注的区别是什么?
  9. python 基础数据类型汇总
  10. SpringAop实现原理及代理模式