将桌面应用程序移植到.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​​或用.NET Core的替代方法代替API的用法。


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


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


  • 解决方案资源管理器中签入您的项目是否包含packages.config文件。 如果不这样做,则无需采取任何措施,如果您这样做,请右键单击packages.config然后选择将packages.config迁移到PackageReference 。 然后单击“ 确定”
  • 右键单击项目,打开项目文件,然后选择Unload Project 。 然后右键单击该项目,然后选择Edit <您的项目名称> .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> 
  • 您可以删除具有<Project><Name>属性的行,因为在新的项目文件样式中不需要它们。 因此,对于找到的每个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设计器已经处于预览阶段,我们正在努力为其添加更多功能。
    • .NET Core的WinForms设计器将在以后提供,与此同时,您可以在其中使用.NET Framework WinForms设计器作为解决方法。

    这是使用.NET Framework WinForms设计器的方法:


    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-CN455325/


All Articles