龙空技术网

把WinForms的桌面应用程序迁移到 .Net5

22高级攻城师 3422

前言:

此时小伙伴们对“net45安装未成功证书”都比较珍视,姐妹们都需要分析一些“net45安装未成功证书”的相关知识。那么小编也在网上网罗了一些有关“net45安装未成功证书””的相关内容,希望看官们能喜欢,各位老铁们快快来了解一下吧!

(因为自己想把 .NET Framework的应用迁移到.NET5,于是有了这个译文)

这篇文章描述了把win Forms桌面应用从.Net Framework迁移到.NET 5平台的方法。.NET5 SDK 已包含对winForm 程序的支持,不过.NET5 平台下的winForms 程序仍然只支持 windows 系统的框架,也只能运行在Windows系统。

从.NET Framework 迁移到 .NET 5,需要创建一个新的项目文件, .NET 5使用SDK风格的项目文件,而典型的.NET Framework框架则使用老的Visual Studio的项目文件(如.vbproj,.csproj)。如果你曾经用文本编辑器打开过一个Visual Studio的项目文件,你就知道它的语法是怎样的。SDK风格的项目文件体积更小,也不需要老的VS项目文件那么多的入口。

要更多了解NET5,参阅 。

迁移前提条件Visual Studio 2019 V16.8 或更高版本

o 选择 桌面应用程序类型

o 选择 .NET5 框架组件

· 在Visual Studio 中预览Winforms 截面设计器

选择设计器,转到菜单 Tools > Options > Environment > Preview Features 选择Use the preview Windows Forms designer for .NET Core apps 选项。

这篇文章以 “配对游戏”(Matching game)示例程序来讲解。()如果你想跟着示例学习,可以下载这个程序并在VS中打开。或者你也可以用你自己开发的项目。需考虑的事项

.NET Framework迁移到.NET5 时,有以下一些事项需要注意

1. 首先需要检查你的程序是否适合迁移

使用.NET可移植性分析器.NET Portability Analyzer 来确定你的项目是否可迁移到.NET5. 如果你的项目与.NET5存在兼容问题,.NET可移植性分析器会帮你定位问题。.NET可移植性分析器是以Visual Studio扩展的形式安装使用,或者或者以命令行的形式使用。这里有分析器的详细介绍()。

2. 你将使用一种不同版本的windows Forms

.NET Core 3.0发布时,Windows Forms在Github上开源。这个开源的.NET5上的WinForms 代码是.NET Framework 框架的Forms代码库的一个分支。这个分支可能存在一些不同,可能导致你的程序难以迁移。

3. Windows兼容包可能帮助你进行迁移操作

有一些在.NET Framework 上存在的API,在.NET5上并不存在。而windows 兼容包(Windows Compatibility Pack,)则添加了很多这种API,从而可能帮助你的WinForms程序与.NET5兼容。

4. 升级你项目中使用的NuGet包

一个较好的习惯做法是,在做任何迁移之前,先把所有使用的NuGet包升级到最新版本。如果你的程序引用了任何NuGet包,升级他们。但是也有确保你的程序能够正常创建:升级之后,如果存在任何包的错误,则需要把相应的包回退到那个能够让你的程序正常创建的最高版本。

备份你的项目

第一步先备份你的项目,在你动手迁移之前!如果发生什么错误,你还能恢复到最初的代码。不要过分依赖于.NET Portability Analyzer来备份你的项目。自己做个安全的备份是更好的。

NuGet 包配置

如果你的程序引用了NuGet包,你可能会在你的项目文件夹中看到一个单独的packages.config包配置文件。在SDK风格的项目中,NuGet包引用是在项目文件里配置的。对于Visual Studio的项目文件,也可以在项目文件中配置NuGet包,但不是默认的,而是可选做法。但.NET5 不使用单独的包配置文件,必须在迁移之前将NuGet包引用迁移到项目文件内。

按以下步骤迁移包配置文件:

1、 解决方案浏览窗口,找到你要迁移的项目

2、 找到packages.config文件并右键,选择 “将Package Config 迁移到PackageReference”

3、 在出来的窗口中,选择所有顶层依赖的NuGet包。

重生成你的项目,以确定NuGet包迁移是否存在问题。

项目文件

下一步,就是将前述的项目文件(例如.csproj/.vbproj)转换为.NET5的SDK风格的项目文件。不过,也有可能你已经在使用SDK风格的项目文件了。你可以很容易地在Visual Studio中确定你使用哪种项目文件。在VS的解决方案浏览窗口中,找到项目文件,右键单击,寻找“编辑项目文件”选项,如果没有这个选项,那么使用的是老的VS项目文件,从而需要升级。

按以下步骤升级项目文件:

1、 在解决方案浏览窗口,找到你要迁移的项目

2、 选中项目,右键“卸载项目”

3、 右键项目,选择“编辑项目文件”,或者直接在文件夹中用记事本打开项目文件

4、 把项目文件的XML文件内容复制到一个文本编辑器并备份;

5、 清空项目文件内容,复制以下内容到已被清空的项目文件

<Project Sdk="Microsoft.NET.Sdk">  <PropertyGroup>    <OutputType>WinExe</OutputType>    <TargetFramework>net5.0-windows</TargetFramework>    <UseWindowsForms>true</UseWindowsForms>    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>  </PropertyGroup></Project>

重要事项

对于DLL函数库项目,需要删除< OutputType > 项

以上XML内容定义了项目的基本结构。但是,它还不包含旧项目文件的任何设置信息。使用上一步备份的旧项目文件内容,按以下步骤操作:

1、从旧的项目文件复制以下元素到新项目文件的 < PropertyGroup >元素中

o <RootNamespace>

o <AssemblyName>

这时,你的项目文件看起来和下面的内容类似:

<Project Sdk="Microsoft.NET.Sdk">  <PropertyGroup>    <OutputType>WinExe</OutputType> ///(对于DLL库文件,删除此行)    <TargetFramework>net5.0-windows</TargetFramework>    <UseWindowsForms>true</UseWindowsForms>    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>    <RootNamespace>MatchingGame</RootNamespace>    <AssemblyName>MatchingGame</AssemblyName>  </PropertyGroup></Project>

把旧项目文件中包含 <ProjectReference>和 <PackageReference>元素的<ItemGroup>节点 复制到 新项目文件的 </PropertyGroup> 标签之后。

你的新项目文件应该看起来像这样:

<Project Sdk="Microsoft.NET.Sdk">  <PropertyGroup>    (contains settings previously described)  </PropertyGroup>  <ItemGroup>    <ProjectReference Include="..\MatchingGame.Logic\MatchingGame.Logic.csproj">      <Project>{36b3e6e2-a9ae-4924-89ae-7f0120ce08bd}</Project>      <Name>MatchingGame.Logic</Name>    </ProjectReference>  </ItemGroup>  <ItemGroup>    <PackageReference Include="MetroFramework">      <Version>1.2.0.3</Version>    </PackageReference>  </ItemGroup></Project>

对于<ProjectReference>元素,并不需要<Project>和<Name>子元素。所以你可以删除如下的内容

<ItemGroup>  <ProjectReference Include="..\MatchingGame.Logic\MatchingGame.Logic.csproj" /></ItemGroup>
资源及设置

.NET FrameWork框架的Windows Forms项目通常还包含类似于Properties/Settings.settings,Properties/Resources.resx等文件。这些文件,以及任何除了窗体资源文件外的resx资源文件,都需要迁移。

从旧的项目文件中复制对应的节点到新项目文件的 <ItemGroup> 元素内,然后修改任何:

任何 类似于 <Compile Include="value">或者<EmbeddedResource Include="value">节点内的 “Include” 为 “Update”.

导入Settings.settings 文件。 注意,在<Compile>节点内,Include 修改为 “Update”

<ItemGroup>  <None Include="Properties\Settings.settings">    <Generator>SettingsSingleFileGenerator</Generator>    <LastGenOutput>Settings.Designer.cs</LastGenOutput>  </None>  <Compile Update="Properties\Settings.Designer.cs">    <AutoGen>True</AutoGen>    <DependentUpon>Settings.settings</DependentUpon>    <DesignTimeSharedInput>True</DesignTimeSharedInput>  </Compile></ItemGroup>

导入任何resx file的配置信息,例如properties/Resources.resx 文件。注意<Compile> 和<EmbeddedResource> 元素内的“Include”修改为“Update”, 同时<SubType>元素要从<EmbeddedResource>中删除。

<ItemGroup>  <EmbeddedResource Update="Properties\Resources.resx">    <Generator>ResXFileCodeGenerator</Generator>    <LastGenOutput>Resources.Designer.cs</LastGenOutput>  </EmbeddedResource>  <Compile Update="Properties\Resources.Designer.cs">    <AutoGen>True</AutoGen>    <DependentUpon>Resources.resx</DependentUpon>    <DesignTime>True</DesignTime>  </Compile></ItemGroup>

转换解决方案下的每一个文件,如果你在使用前面提到的示例程序,MatchingGame.Logic项目将会被转换。

编辑App.config文件

如果你的程序有一个App.config file,需要删除其中的<supportedRuntime>节点。即类似如下节点:

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />

对于App.config文件,有点内容你需要注意下。.NET Framework框架下的App.config文件不仅仅配置你的程序,同时也配置了运行时设置和行为,比如日志。但是在.NET5和.NET Core项目,App.config文件不再用于运行时配置。如果你的文件含有相应的节段,将不会起作用。

添加兼容包

如果编译失败,收到如下类似的错误信息:

· 无法找到 某某类型或命名空间<xxx>

· 在当前上下文中,<xxx>名称不存在

你可能需要添加 兼容包到你的程序中(Microsoft.Windows.Compatibility)。这个兼容包添加了约21000个.NET Framework 的API。比如System.Configuration.ConfigurationManager类和注册表交互的API。

按如下方法添加 兼容包:

<ItemGroup>  <PackageReference Include="Microsoft.Windows.Compatibility" Version="5.0.0-rc.2.20475.5" /></ItemGroup>
测试你的程序

完成迁移后,你就可以测试你的程序了!

标签: #net45安装未成功证书