将应用从 .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
https://www.cnblogs.com/densen2014/p/16158137.html
电脑