将桌面应用程序移植到.NET Core

自从我开始与社区合作,将桌面应用程序从.NET Framework移植到.NET Core时,我注意到有“两大阵营”:一个人的代表希望获得一个非常简单的简短说明列表,以将其应用程序移植到.NET Core。 ,而另一位代表则更倾向于采用具有更多初始信息的更原则的方法。 与其编写“瑞士军刀”之类的文档,不如发布两篇博客文章,每个“阵营”一篇:

  • 这篇文章很简单 。 它着重于简单的指令和小型应用程序,并考虑了将应用程序移植到.NET Core的最简单方法。
  • 稍后,我们将针对更复杂的案例发表另一篇文章 。 它将专注于非平凡的应用程序,例如依赖于WCF和第三方UI包的WPF应用程序。

如果您喜欢观看视频而不是阅读,那么以下是我做下面描述的所有视频。


步骤0-前提条件


要将桌面应用程序转移到Core,您将需要.NET Core 3和Visual Studio 2019。

步骤1-启动可移植性分析器


移植之前,应检查应用程序与.NET Core的兼容性。 为此,请下载并运行.NET Portability Analyzer

  • 在第一个选项卡“可移植性摘要”上,如果.NET Core列中的所有值均为100%(所有内容以绿色突出显示),则您的代码是完全兼容的,并且可以转到步骤2。
  • 如果值小于100%,请首先查看不属于应用程序的所有程序集。 对于他们,您需要检查他们的作者是否提供.NET Core或.NET Standard的版本。
  • 现在查看来自您的代码的程序集的另一部分。 如果在“可移植性报告”中未指定任何程序集,请转到步骤2。完成后,打开“详细信息”选项卡,通过单击“程序集”列来筛选表,并仅关注与您的应用程序相关的程序集。 浏览列表和代码重构,以停止使用API​​或将API替换为.NET Core替代方案。

图片

第2步-将.csproj迁移到SDK样式


解决方案资源管理器中,右键单击您的项目(不是解决方案!)。 您看到编辑项目文件了吗? 如果是这样,则您已经在使用SDK样式的项目文件,因此应该转到步骤3 。 如果不是,请执行以下操作:

  • 解决方案资源管理器中签入项目是否包含packages.config文件。 如果不是,则无需采取任何措施,如果是,请右键单击packages.config,然后选择将packages.config迁移到PackageReference 。 然后单击“ 确定”
  • 通过右键单击项目并选择Unload Project打开项目文件。 然后右键单击该项目,然后选择“ 编辑<您的项目名称> .csproj”
  • 例如,将项目文件的内容复制到记事本中,以便以后可以搜索它。
  • 从在Visual Studio中打开的项目文件中删除所有内容(我知道这听起来很激进,但是我们仅需要几个步骤就可以从副本中添加必要的内容)。 粘贴以下代码,而不只是删除文本。

    对于WinForms上的应用程序:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net472</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project> 

    对于WPF应用程序:

     <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net472</TargetFramework> <UseWPF>true</UseWPF> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup> </Project> 
  • 查找记事本PackageReference 。 如果您什么都没找到,请继续。 如果找到PackageReference ,则将包含PackageReference的整个ItemGroup复制到在Visual Studio中打开的项目文件中,在上面步骤中插入的行的正下方。 对找到的每个PackageReference元素执行此操作。 复制的块应如下所示:

     <ItemGroup> <PackageReference Include="NUnit"> <Version>3.11.0</Version> </PackageReference> </ItemGroup> 
  • 现在,对ProjectReference进行与上述相同的操作。 如果您什么都没找到,请继续。 如果找到任何ProjectReference元素,它们将如下所示:

     <ItemGroup> <ProjectReference Include="..\WindowsFormsApp1\WindowsFormsApp1.csproj"> <Project>{7bce0d50-17fe-4fda-b6b7-e7960aed8ac2}</Project> <Name>WindowsFormsApp1</Name> </ProjectReference> </ItemGroup> 
  • 您可以使用ProjectName属性删除行,因为新样式的项目文件不需要它们。 因此,对于找到的每个ProjectReference (如果有),仅复制ItemGroupProjectReference

     <ItemGroup> <ProjectReference Include="..\WindowsFormsApp1\WindowsFormsApp1.csproj" /> </ItemGroup> 
  • 全部保存。 在Visual Studio中关闭.csproj文件。 在解决方案资源管理器中右键单击您的项目,然后选择Reload Project 。 重建并确保没有错误。

好消息,您刚刚将项目文件更新为新的SDK样式! 该项目仍然针对.NET Framework,但是现在您可以将其重新配置为.NET Core。

步骤3-在.NET Core上重新定位


通过在解决方案资源管理器中双击打开项目文件。 找到TargetFramework属性并将其值更改为netcoreapp3.0 。 您的项目文件现在应如下所示:

 <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> ... </PropertyGroup> ... </Project> 

生成并运行您的项目。 恭喜,您已将其迁移到.NET Core 3!

错误修复


如果遇到类似的错误

 The type or namespace <some name> could not be found 



 The name <some name> does not exist in the current context 

并且如果您的可移植性报告显示为绿色,则应该知道,只需将NuGet程序包与相应的库一起添加即可轻松修复它们。 如果找不到缺少库的NuGet软件包,请尝试与Microsoft.Windows.Compatibility联系。 该软件包从.NET Framework添加了〜21K .NET API。

与设计师合作


尽管可以使用代码来编辑应用程序的用户界面,但是开发人员通常更喜欢使用可视构造函数。 使用.NET Core,我们必须更改.NET Core项目的设计人员的工作架构:

  • WPF Designer已经处于预览模式,我们正在努力为其添加其他功能。
  • 用于.NET Core的WinForms Designer稍后将提供,因此现在,您可以使用用于.NET Framework的WinForms Designer作为解决方法。

这是将WinForms构造函数用于.NET Framework的方法:

  1. 复制.csproj文件(例如, MyProject.csproj ),给它一个不同的名称,例如MyProject.NetFramework.csproj,并将其放置在现有项目文件旁边。
  2. 确保在Visual Studio中关闭了项目,然后打开一个新项目MyProject.NetFramework.csproj
    解决方案资源管理器中,右键单击您的项目,然后选择“ 属性” 。 在“应用程序”选项卡上(默认情况下应打开),将“ 程序名称”和“ 默认名称空间”设置为与原始项目相同的值(从名称中删除“ .NetFramework”)。
    将此解决方案保存在现有解决方案旁边。
  3. 打开一个新的项目文件,并将TargetFramework更改为net472
  4. 现在您需要使用WinForms构造函数,从MyProject.NetFramework.csproj加载项目,然后就可以开始使用.NET Framework构造函数了。 完成后,请使用.NET Core项目文件关闭并打开您的项目。
  5. 在准备好用于.NET Core的WinForms构造函数之前,这只是一种解决方法。

为什么要切换到.NET Core?


观看一个视频,我和Scott Hunter讨论.NET Core 3的所有最新更新。 迁移到.NET Core 3.0

Source: https://habr.com/ru/post/zh-CN454508/


All Articles