本文转自 https://blog.csdn.net/WPwalter/article/details/82859449

分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0 )

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/1036 访问。

今年五月的 Build 大会上,微软说 .NET Core 3.0 将带来 WPF / Windows Forms 这些桌面应用的支持。当然,是通过 Windows 兼容包(Windows Compatibility Pack)实现的。为了提前检查你的程序是否能在未来跑在 .NET Core 3.0 上,微软在 2018年8月8日 推出了 .NET Core 3.0 Desktop API Analyzer,帮助你提前检查你的程序能有多容易迁移到 .NET Core 3.0

本文将介绍其使用方法,并介绍 API 的逐步迁移方法。


.NET Core 3.0 Desktop API Analyzer

你可以前往 GitHub 查看 .NET Core 3.0 Desktop API Analyzer 项目:

去 release 标签下即可下载。当然,目前仅发布一个版本,你也可以点击以下链接直接下载:

下载完后解压到任意目录即可运行。

分析一个 WPF 程序

第一个想到的,是分析目前已在商店发布的基于 .NET Framework 4.7 的 WPF 程序 标识符命名工具 - Whitman。



▲ 分析 WPF 程序

其实这个目录下只有一点点程序集,所以分析起来很快的。



▲ Whitman 的目录结构

选好后,点击 Analyze,在 Analyzing… 提示等待之后,即可在它指定的临时目录中找到分析结果文件:

  1. Report saved in:
  2. C:\Users\walterlv\AppData\Local\Temp\PortabilityReport.xlsx

竟然是一个 Excel 表格!



▲ Excel 表格表示的结果

可以看到,我的 Whitman 对 .NET Core 3.0 的 API 是 100% 兼容的。将来迁移的时候可以不需要修改代码。

分析更复杂的程序

我试着分析一个更庞大的 WPF 软件目录后,发现还是有一些 API 是不兼容的。



▲ 有一些 API 不兼容



▲ 有一些程序集兼容性很低

这份 Excel 表格中还包含了具体哪些 API 是不兼容的,并为部分使用提供了建议:



▲ 查看不兼容的 API

所以,我们只需要查找对对应 API(第一列)的使用,然后通过其他技术手段将其替换成别的方法来写即可解决这样的兼容性问题。

着手解决兼容性问题

比如我们拿出其中一行:

Target type Target member Header for assembly name entries .NET Core Recommended changes
T:System.Runtime.Remoting.Messaging.MethodCallMessageWrapper T:System.Runtime.Remoting.Messaging.MethodCallMessageWrapper Walterlv.Placeholder Not supported Remove usage.

我们通过在 Walterlv.Placeholder(这只是个占位程序集,实际名称已隐去)中全解决方案中搜索 MethodCallMessageWrapper 可以找到此 API 的所有使用。

  1. public override IMessage Invoke(IMessage msg)
  2. {
  3. var caller = new MethodCallMessageWrapper((IMethodCallMessage) msg);
  4. // 省略其他代码。
  5. }

此方法在此处上下文的目的是实现 AOP 代理,即为了实现切面编程,允许在实体类的每个方法执行之前注入一些代码。

既然此处基于 .NET Framework MethodCallMessageWrapper 的 AOP 已不可用,那么我们需要寻找到 .NET Core 中 AOP 的替代品。例如 .NET Core 官方推荐的是:

于是,我们几乎需要改造此类型,使其对 .NET Framework 中 MethodCallMessageWrapper 的使用替换成对 AspectCore-Framework 的依赖。

这是一项繁重的工作,不过还是要做的。迁移到 .NET Core 有很多好处,不是吗?

一些错误

额外的,在其他一些程序的分析中,我遇到了一些错误。通过混淆的比较,我认为此错误可能源于程序集的混淆:

  1. Unable to analyze.
  2. Details:
  3. Detecting assembly references [Failed]
  4. Cannot locate assembly information for System.Object. Microsoft assemblies found are:
  5. Cannot locate assembly information for System.Object. Microsoft assemblies found are:
  6. Cannot locate assembly information for System.Object. Microsoft assemblies found are:
  7. Cannot locate assembly information for System.Object. Microsoft assemblies found are:
  8. Cannot locate assembly information for System.Object. Microsoft assemblies found are:
  9. Cannot locate assembly information for System.Object. Microsoft assemblies found are:
  10. Cannot locate assembly information for System.Object. Microsoft assemblies found are:
  11. Cannot locate assembly information for System.Object. Microsoft assemblies found are:

如果你想了解更多混淆相关的资料,可以阅读我的另一篇博客:.NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)

未来的迁移

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/1036 访问。

.NET Core 并不会原生提供 WPF / Windows Forms 这些桌面应用的支持,而是通过 Windows 兼容包(Windows Compatibility Pack)实现。你可以阅读微软官方博客了解:

Announcing the Windows Compatibility Pack for .NET Core - .NET Blog

迁移到 .NET Core 并不会为这些程序带来跨平台特性,只是能够充分利用到 .NET Core 带来的诸多好处而已。比如更高的性能,更方便的部署,及时的更新。当然还有 MIT 开源,我们能够和社区一起修复 Bug。

分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0的更多相关文章

  1. 分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0(使用 .NET Core 3.0 Desktop API Analyzer )

    今年五月的 Build 大会上,微软说 .NET Core 3.0 将带来 WPF / Windows Forms 这些桌面应用的支持.当然,是通过 Windows 兼容包(Windows Compa ...

  2. .net core 开发 Windows Forms 程序

    我是一名 ASP.NET 程序员,专注于 B/S 项目开发.累计文章阅读量超过一千万,我的博客主页地址:https://www.itsvse.com/blog_xzz.html 引言 .net cor ...

  3. Windows 下的高 DPI 应用开发(UWP / WPF / Windows Forms / Win32)

    本文将介绍 Windows 系统中高 DPI 开发的基础知识.由于涉及到坐标转换,这种转换经常发生在计算的不知不觉中:所以无论你使用哪种 Windows 下的 UI 框架进行开发,你都需要了解这些内容 ...

  4. 如何为Windows Forms应用程序添加启动参数(Start-Up Parameters)

    很多场合下,我们需要通过命令行或者快捷方式在Windows Forms程序启动时向其传递参数. 这些参数可能是用来加载某一个文档,或者是应用程序的初始化配置文件. 特别是对那些需要高度自定义配置的大程 ...

  5. Windows Forms (一)

    导读 1.什么是 Windows Forms 2.需要学Windows Forms 么? 3.如何手写一个简单的Windows Forms 程序 4.对上面程序的说明 5.Form 类与Control ...

  6. Windows Forms(二)

    导读 1.用VS创建一个Windows Forms程序 2.分析上面的程序 3.Mediator pattern(中介者模式) 4.卡UI怎么办——BackgroundWorker组件 用VS创建一个 ...

  7. System.Windows.Forms.ListView : Control

    #region 程序集 System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ...

  8. C# Windows Forms 事件处理顺序

    事件引发的顺序对某些Windows 窗体应用来说十分重要.当某些事件需要特别处理时(如重绘窗体的某些部分),必须知道事件在运行时的确切引发顺序.下面就应用程序和控件的生命周期中的几个重要阶段的事件顺序 ...

  9. Windows.Forms Panel 动态加载用户控件 UserControl

    创建好一个Windows Forms程序,在创建好的程序中Form1添加一个Panel控件 如图:

随机推荐

  1. 【RPA Starter第三课】第一个Uipath项目:HelloWord

    最后是一个小项目,开启使用Uipath.Uipath云平台,Uipath Orchestrator,Uipath Studio,发布项目.怎么启动机器人.都有详细的步骤. Uipath 的账号是通用的 ...

  2. J.U.C体系进阶(二):juc-locks 锁框架

    Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-locks 锁框架 接口说明 Lock接口 类型 名称 void loc ...

  3. 使用nvm安装node,运行node报错 node: command not found

    1. 使用nvm安装node之后,直接运行node命令会报错 node: command not found 需要使用nvm ls  查询一下当前使用的安装的node版本,然后使用node use 版 ...

  4. K8s-Pod健康检查原理与实践

    Pod健康检查介绍 默认情况下,kubelet根据容器运行状态作为健康依据,不能监视容器中应用程序状态,例如程序假死.这将会导致无法提供服务,丢失流量.因此重新健康检查机制确保容器健康幸存.Pod通过 ...

  5. 题解 洛谷 P4695 【[PA2017]Banany】

    考虑用动态点分治来解决像本题这样带修的树上路径问题. 首先对原树进行点分治,建出点分树,在点分树每个节点上用动态开点线段树来维护以该节点为起点,到其点分树子树中每个节点的利润. 查询时只需在点分树上当 ...

  6. Ubuntu安装Docker(官方文档翻译)

    翻译自Docker官方文档 https://docs.docker.com/engine/installation/linux/ubuntulinux/ 之前因为看不懂官方文档,卡在某个步骤无法完成安 ...

  7. vue history路由模式 Nginx 生产实践

    nginx(带二级目录的配置) location ~* /A {    alias  /opt/nginx-1.4.7/html/ued/A;     try_files $uri $uri /A/s ...

  8. springboot手动事务回滚

    亲测在使用@Transactional.@Transactional(rollbackFor = Exception.class)及catch异常之后 throw new RuntimeExcepti ...

  9. docker-compose安装zabbix

    在网上的很多帖子,我亲自试过,多数不行,启动后zabbix_server是退出状态,所以觉得自己亲自写一篇帖子,以作记录 1.安装docker和docker-compose yum install - ...

  10. springboot(二)配置SpringBoot支持自动装载Servlet

    Servlet详解:https://blog.csdn.net/yanmiao0715/article/details/79949911 Web 技术成为当今主流的互联网 Web 应用技术之一,而 S ...