分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0
今年五月的 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
分析一個 WPF 程序
分析更復雜的程序
著手解決兼容性問題
一些錯誤
未來的遷移
.NET Core 3.0 Desktop API Analyzer
你可以前往 GitHub 查看 .NET Core 3.0 Desktop API Analyzer 項目:
Microsoft/dotnet-apiport-ui
去 release 標簽下即可下載。當然,目前僅發布一個版本,你也可以點擊以下鏈接直接下載:
PortabilityAnalyzer.zip
下載完后解壓到任意目錄即可運行。
分析一個 WPF 程序
第一個想到的,是分析目前已在商店發布的基于 .NET Framework 4.7 的 WPF 程序?標識符命名工具 - Whitman。
▲ 分析 WPF 程序
其實這個目錄下只有一點點程序集,所以分析起來很快的。
▲ Whitman 的目錄結構
選好后,點擊?Analyze,在?Analyzing…?提示等待之后,即可在它指定的臨時目錄中找到分析結果文件:
Report saved in: C:\Users\walterlv\AppData\Local\Temp\PortabilityReport.xlsx
竟然是一個 Excel 表格!
▲ Excel 表格表示的結果
可以看到,我的 Whitman 對 .NET Core 3.0 的 API 是 100% 兼容的。將來遷移的時候可以不需要修改代碼。
分析更復雜的程序
我試著分析一個更龐大的 WPF 軟件目錄后,發現還是有一些 API 是不兼容的。
▲ 有一些 API 不兼容
▲ 有一些程序集兼容性很低
這份 Excel 表格中還包含了具體哪些 API 是不兼容的,并為部分使用提供了建議:
▲ 查看不兼容的 API
所以,我們只需要查找對對應 API(第一列)的使用,然后通過其他技術手段將其替換成別的方法來寫即可解決這樣的兼容性問題。
著手解決兼容性問題
比如我們拿出其中一行:
| T:System.Runtime.Remoting.Messaging.MethodCallMessageWrapper | T:System.Runtime.Remoting.Messaging.MethodCallMessageWrapper | Walterlv.Placeholder | Not supported | Remove usage. |
我們通過在 Walterlv.Placeholder(這只是個占位程序集,實際名稱已隱去)中全解決方案中搜索?MethodCallMessageWrapper?可以找到此 API 的所有使用。
public override IMessage Invoke(IMessage msg){var caller = new MethodCallMessageWrapper((IMethodCallMessage) msg);// 省略其他代碼。}此方法在此處上下文的目的是實現 AOP 代理,即為了實現切面編程,允許在實體類的每個方法執行之前注入一些代碼。
既然此處基于 .NET Framework?MethodCallMessageWrapper?的 AOP 已不可用,那么我們需要尋找到 .NET Core 中 AOP 的替代品。例如 .NET Core 官方推薦的是:
dotnetcore/AspectCore-Framework: AspectCore is an AOP-based cross platform framework for .NET Standard.
于是,我們幾乎需要改造此類型,使其對 .NET Framework 中?MethodCallMessageWrapper?的使用替換成對?AspectCore-Framework?的依賴。
這是一項繁重的工作,不過還是要做的。遷移到 .NET Core 有很多好處,不是嗎?
一些錯誤
額外的,在其他一些程序的分析中,我遇到了一些錯誤。通過混淆的比較,我認為此錯誤可能源于程序集的混淆:
Unable to analyze. Details: Detecting assembly references ? ? ? ? ? ? ? ? ? ? ?[Failed]Cannot locate assembly information for System.Object. Microsoft assemblies found are: Cannot locate assembly information for System.Object. Microsoft assemblies found are: Cannot locate assembly information for System.Object. Microsoft assemblies found are: Cannot locate assembly information for System.Object. Microsoft assemblies found are: Cannot locate assembly information for System.Object. Microsoft assemblies found are: Cannot locate assembly information for System.Object. Microsoft assemblies found are: Cannot locate assembly information for System.Object. Microsoft assemblies found are: Cannot locate assembly information for System.Object. Microsoft assemblies found are:如果你想了解更多混淆相關的資料,可以閱讀我的另一篇博客:.NET 中各種混淆(Obfuscation)的含義、原理、實際效果和不同級別的差異(使用 SmartAssembly)。
未來的遷移
.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。
關于 .NET Framework 遷移到 .NET Core 的好處,以及 .NET Framework 未來的支持情況,可以閱讀微軟的另一篇博客了解:
Update on .NET Core 3.0 and .NET Framework 4.8 - .NET Blog
原文地址:https://walterlv.com/post/net-core-desktop-api-analyzer.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的分析现有 WPF / Windows Forms 程序能否顺利迁移到 .NET Core 3.0的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core实战项目之CMS 第十
- 下一篇: Stack Overflow 监控系统内