本地编译WPF框架源码
最近,在 排查WPF框架触摸失效和书写 Stroke 绘制的问题,常常需要查看WPF 的源码,由于项目组用到的框架大部分都是 .netFramwork 的,只能通过VS的F12按键反编译或者Dnspy 反编译抓取源码,还要在创建一个新的demo,把反编译的代码整理成demo调试。这样很不方便,也不好调试。于是乎,反正WPF都是开源的,一劳永逸的方式就是本地手动编译WPF框架的源码,这样就好定位问题,至少可以调试源代码。
开始进去正题:
1、先在Github fork 一份 WPF 的源代码:Dotnet9527/wpf at refs/heads/main,用于自己编译调试使用,以后如果有修改东西,也可以贡献到社区上
2、克隆源代码到本机
3、编译准备工作
下载 windows SDK Windows SDK and emulator archive | Microsoft Developer
本次编译,我观察了 "E:\Code\wpf\src\Microsoft.DotNet.Wpf\src\WpfGfx\core\dll\WpfGfx.sln" 这个项目的C++的代码用到的是 10.0.19041.0 的版本,于是,我在我原来win11的版本上,又安装了win10的这个10.0.19041.0 的版本,确保能编译通过
设置网络能访问外网(搭个梯子),最好网速要快,不然在拉取一些依赖库,很容易超时,导致编译失败
4、用PowerShell执行编译脚本
PowerShell 进入WPF仓库的根目录下,执行如下的命令行
.\build.cmd -pack -ci -configuration Debug -prepareMachine /p:Platform=x86
如果网络畅通的情况下,过一会就会出现如下的报错:
这个错误,查阅了资料,在WPF的Issue Unable to build WPF in github action with v6.0.23 · Issue #8343 · dotnet/wpf 上找到了问题修复,就是安装 C++ CLI的工具库(这个根据不同系统、不同的VS,选择的版本有可能不一样)。打开VS的Installer 工具箱,安装C++ CLI
PenImc 项目编译报错
继续往下编译,控制台又出现了 PenImc 模块的编译报错:
E:\Code\wpf\src\Microsoft.DotNet.Wpf\src\PenImc\dll\stdafx.h(46,10): error C1083: 无法打开包括文件: “atlbase.h”: No such file o r directory [E:\Code\wpf\src\Microsoft.DotNet.Wpf\src\PenImc\dll\PenImc.vcxproj]
这个问题查了好多资料,甚至乎在PenImc的C++项目上,手动添加了 atlbase.h 和 atls.lib 的,也不行。C1083无法打开包括文件: “atlbase.h”: No such file or directory-电脑相关-虾米宝库
从网上资料看来,大多都是指向ALT的库,于是乎,我索性把Vs的Installer的所有支持的ALT的依赖库全部安装上去了
最后再执行 .\build.cmd -pack -ci -configuration Debug -prepareMachine /p:Platform=x86,编译成功了。
对应的WPF的nuget包已经生成
总结一下:
1、编译前,环境要提前配置好,特别是C++的依赖,最好全部安装了
2、搭个好一点的梯子,不然很容易失败,一旦失败就要清理临时文件
参考资料:
手把手教你如何构建 WPF 官方开源框架源代码 - lindexi - 博客园
C1083无法打开包括文件: “atlbase.h”: No such file or directory-电脑相关-虾米宝库
Cannot open include file: 'atlbase.h': build failed · Issue #483 · microsoft/terminal