手把手教你构建WPF官方开源框架源代码

    从去年微软就将 WPF 开源了,差不多现在所有 WPF 的源代码都开源了。在学习框架的时候,我会做一些改动,期望能构建一个自己的版本进行测试。但是作为一个特别大的框架,想要构建跑起来可不是直接在 VisualStudio 里面点击一下运行就完成了,需要做很多的准备才可以。本文将一步步教你如何构建 WPF 框架源代码

我不敢说每个版本的 WPF 框架的源代码我都能构建,在官方仓库 https://github.com/dotnet/wpf 我构建成功的版本是这个 commit 小伙伴可以尝试使用本文的方法,先切的这个 commit 按照我的方法来进行构建,成功了之后再做更新版本的尝试

阅读本文能让你了解如何构建WPF框架 https://github.com/dotnet/wpf源代码,但是不确保你一定能构建成功

构建 WPF 的步骤如下:

  1. 下载构建需要的依赖库

  2. 还原 NuGet 包

  3. 按照顺序构建 C++ 和 C# 代码,创建 NuGet 包

这里面对于咱国内的小伙伴,最坑的问题就是下载构建需要的库,需要的库如下

  • dotnet-sdk-5.0.100-preview.1.20155.7-win-x64.zip 安装

  • dotnet-runtime-5.0.0-preview.4.20220.15-win-x86.zip 安装

  • strawberry-perl-5.28.1.1-1-win64-x64.zip 放到 .netcoreeng\native\temp 文件夹

  • net-framework-48-ref-assemblies-0.0.0.1-win64-x64.zip 放到 .netcoreeng\native\temp 文件夹

  • dotnet-api-docs_netcoreapp3.0-0.0.0.2-win64-x64.zip 放到 .netcoreeng\native\temp 文件夹

  • msvcurt-c1xx-0.0.1.2-win64-x64.zip 放到 .netcoreeng\native\temp 文件夹

  • net-framework-472-iltools-0.0.0.1-win64-x64.zip 放到 .netcoreeng\native\temp 文件夹

  • dotnet-runtime-2.1.7-win-x86.zip 安装

上面说的 .netcoreeng\native\temp 文件夹就是在用户名下的如 C:\Users\lindexi\.netcoreeng\native\temp\ 文件夹

这些文件都是十分大的,同时有一些文件会下载放在系统的临时文件夹,如果一开始下载失败了,第二次不会进行校验,只会出现 IO 解压缩错误,此时就需要小伙伴清空自己的系统临时文件夹,用户临时文件夹和 C:\Users\lindexi\.netcoreeng\native\temp\ 文件夹

在进行构建的时候还需要让 VisualStudio 安装了差不多所有能装的负载,毕竟需要构建 C++ 这样的东西,这对 VisualStudio 版本也有要求。最低的 VisualStudio 要求是 16.4 版本

当前,我肯定不会一开始说这么劝退的方法,在本地构建的失败率太高了,即使是我全用梯子下载,也没有成功,因为有一点是在于构建的代码里面,微软的小伙伴认为网速都是特别快的,没有在一定的时间内下载完成就是失败。而我基本上每次都是下载到失败。同时失败之后下一次没有做校验,也就是除非我全部删除了重新下载,否则可能因为下载不完成构建一半翻车

一个简单的方法是利用 GitHub 的 Action 构建,感谢微软,微软收购了 GitHub 给了大量土豪的支持,所有小伙伴只要创建 GitHub 账号都能免费使用 GitHub 的 Action 构建代码。而构建的服务器可以选择 Windows 全环境服务器,在服务器里面安装了最新的 VisualStudio 和所有的负载,功能齐全,下载安装网速基本有 100M 一秒的速度。重要的是这么强大的服务器还是免费使用,不要钱,只要编写构建脚本就会自动执行

好,差不多广告费到手了,下面让我告诉大家如何使用 GitHub 的 Action 构建 WPF 的框架源代码

在开始之前先说为什么

原因一在于环境,因为 WPF 代码包含一部分 C++ 代码,这部分代码特别调环境。需要差不多将 VisualStudio 的全部功能安装才能。我就在这里翻车了,我就少安装了一个,然后就翻车了,但是很难猜到是少安装了,因为提示很诡异。虽然我就一句话,给 VisualStudio 按照全部功能,但是我预计你不会听我的

原因二在于网速,要下载的包还是大了一点,同时还原 NuGet 的服务器也没有国内源

刚好 GitHub 的 Action 都能满足条件,包含了全部环境,下载速度特别快

使用 GitHub 的 Action 的方法就是创建一个构建清单文件,放在 .github\workflows\ 文件夹里面。清单文件是 yml 格式,如 dotnetcore.yml 文件

这个清单文件的格式不是咱的重点,理论上小伙伴看了代码大概就能理解了,不需要去学习

name: .NET Coreon: [push]jobs:build:runs-on: windows-lateststeps:- uses: actions/checkout@v1- name: Install Nugetuses: nuget/setup-nuget@v1with:nuget-version: '5.x'- name: Buildrun: .\build.cmd -pack -ci -configuration Release -prepareMachine /p:Platform=x86

没错,将这个清单文件放在清单文件夹里面,如 这个 commit 的做法 就可以让 WPF 构建起来

上面的清单文件也是最简单的让 WPF 构建的代码了,核心代码是 .\build.cmd -pack -ci -configuration Release -prepareMachine /p:Platform=x86 通过这句代码就可以调用微软小伙伴写好的脚本进行构建

在日志里面看到输出构建了 nupkg 文件就是构建成功

2020-04-23T04:00:24.5493423Z   Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\runtime.win-x86.Microsoft.DotNet.Wpf.GitHub.5.0.0-ci.nupkg'.
2020-04-23T04:00:40.3376680Z   Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\Microsoft.DotNet.Arcade.Wpf.Sdk.5.0.0-ci.nupkg'.
2020-04-23T04:00:41.1278940Z   Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\Microsoft.DotNet.Wpf.GitHub.5.0.0-ci.nupkg'.
2020-04-23T04:00:42.2993941Z   Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\Microsoft.DotNet.Wpf.ProjectTemplates.5.0.0-ci.nupkg'.
2020-04-23T04:00:43.0266336Z   Successfully created package 'D:\a\wpf\wpf\artifacts\packages\Release\NonShipping\Microsoft.NET.Sdk.WindowsDesktop.5.0.0-ci.nupkg'.
2020-04-23T04:00:45.5485389Z 
2020-04-23T04:00:45.5486750Z Build succeeded.
2020-04-23T04:00:45.5488608Z     0 Warning(s)
2020-04-23T04:00:45.5489064Z     0 Error(s)
2020-04-23T04:00:45.5489325Z 
2020-04-23T04:00:45.5921119Z Time Elapsed 00:05:29.82

也就是最简单的构建 WPF 的方法就是先 Fork 官方仓库到自己的仓库,将 WPF 代码 Clone 到本地,切换 commit 到 f226a72ed5302737b14984cffdd6208731244038 版本,切换 commit 可以使用下面 Git 命令

git checkout f226a72ed5302737b14984cffdd6208731244038

然后新建一个分支,使用 Git 命令如下

git checkout -b 分支名

复制本文上面的清单文件的代码,在相对于 .git 文件夹的 .github\workflows\ 文件夹创建 dotnetcore.yml 文件,将上面的清单代码放入到 dotnetcore.yml 文件

使用 Git 创建 commit 或通过 VisualStudio 的团队管理创建 commit 推送到自己的 Fork 的仓库里面,此时将会触发 GitHub 的 Action 的自动构建

在构建完成的 WPF 的输出是 NuGet 包,在 artifacts\packages 文件夹

在构建成功之后,还请小伙伴试试切换 WPF 的源代码到最新,尝试构建一下

本地构建的方法相对来说比较复杂,虽然从上面的清单文件可以看到,其实构建的代码只有调用脚本一句话。但是本地需要先让环境搭建,如让 VisualStudio 安装全部功能等

本地构建的方法如下

先打开 VisualStudio 让 VisualStudio 安装全部的功能,特别是 C++ 的全部勾选

保持本地是系统是 Windows 10 最新版本

下载 Download the Windows Driver Kit (WDK) 安装,我不确定这是不是必须的

搭建好梯子,设置全局代理

通过 PowerShell 执行 .\build.cmd 脚本,注意此时不要添加任何后缀,这样将可以在输出信息里面快速知道是不是下载失败了

如果下载失败了,将会提示如解压缩失败等,此时请清空自己的系统临时文件夹,用户临时文件夹,和 .netcoreeng 文件夹。这里的 .netcoreeng 放在用户文件夹,如 C:\Users\lindexi\.netcoreeng\ 文件夹。清空 NuGet 缓存文件夹。调用 git clean -xdf 清空代码文件

可以通过梯子的输出找到当前需要下载的文件的链接,可以尝试做本地的代理,先用其他方式下载然后用 Fiddler 模拟路径提升下载速度

如果可以到输出下面代码,表示前面的下载工具应该完成

LINK : fatal error LNK1104: cannot open file 'MSVCURTD_netcore.LIB' [D:\a\wpf\wpf\src\Microsoft.DotNet.Wpf\src\DirectWriteForwarder\DirectWriteForwarder.vcxproj]

上面代码是因为没有指定 x86 的方式构建,在命令行运行 .\build.cmd -pack -ci -configuration Release -prepareMachine /p:Platform=x86 尝试构建

如果还是失败了,可以多次尝试上面的命令,先不要做任何的清理。或者先调用git clean -xdf 清理一下,然后继续调用上面命令

大概在尝试很多次,应该可以构建成功,之后就可以愉快打开 VisualStudio 了,在里面单独构建某个项目了。当然也不是所有的项目都能成功构建

在调用上面的脚本的命令里面,其实还有以下的调用方法,分别是进行 x86 和 x64 的构建,以及进行 Debug 和 Release 的构建

build.cmd -pack -ci -configuration $(Configuration) -prepareMachine /p:Platform=$(Platform)

请将上面代码的 $(Configuration) 替换为 Debug 或 Release 将 $(Platform) 替换为 x86 或 x64 进行构建

如果能生成官方的构建 ID 可以在命令行添加下面参数 /p:OfficialBuildId=$(BuildId) 这里的 BuildId 在官方仓库里面用的是 $(BUILD.BUILDNUMBER) 这是在 Azure Pipelines 的参数,大概的值的是 20190909.1 这样的值,可以自己随意给

上面参数的 -ci 是 arcade 提供的功能,用来启动 CI 构建

能构建官方开源代码就可以作出自己私有的版本,在使用上面命令构建完成之后,可以在 artifacts\packages 文件夹找到构建的 NuGet 包,这些文件可以私有发布,或者自己修改 Id 发布

现在微软的开源协议非常友好,允许小伙伴对源代码进行修改和发布

虽然可以进行自己的私有发布,当时我还是推荐将代码提到官方仓库,有官方的大佬帮忙看看代码是否合理。只要在官方的大佬认为代码不合理但是自己却觉得必须,或者官方发布太慢了,才使用自己的版本

原因是如果都用自己的版本,后续官方修了一些内容,将很难合并到自己的版本

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。本文首次由 [林德熙] 发表于:http://blog.csdn.net/lindexi_gd。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙]。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员中的明星,超模or女团都是程序媛

全世界只有3.14 % 的人关注了数据与算法之美程序员改变世界已经有几十年的历史了,程序员出名又神秘——出名的是大家都知道程序员有多厉害,神秘的是外界对程序员的认知不够具体,“格子衫、双肩包、木讷、代码、……”程序员的标签有很多&…

php 实现类,php如何实现类

php如何实现类php实现类的方法是&#xff1a;【class 类名{ }】&#xff0c;如【<?php class Student { }】。类是由属性、方法、常量组成的&#xff0c;类名以字母、下划线开头&#xff0c;后面跟字母、数字、下划线。在PHP中实现类和对象(学习视频推荐&#xff1a;java课…

Id都是“とつくとき”这样的怎么爬,在线等,急

一般来说&#xff0c;我们推荐使用整数Id作为数据表的主键&#xff0c;这样可以提供不少好处&#xff1a;存储空间小&#xff0c;简洁易懂&#xff0c;方便分页、排序、索引。但当这种Id暴露到外部时&#xff0c;比如订单号&#xff0c;就存在一定的风险了。因为不管是自增、雪…

舍不得删的12个优质公号

全世界有3.14 % 的人已经关注了数据与算法之美在信息爆炸的时代快节奏的生活里 你是否曾有一瞬间觉得忙碌而空虚&#xff1f;以下12个优质公众号能让你在闲暇的时候不断的提升自我&#xff0c;拓宽视野愿以书卷气&#xff0c;行我路千里近现代史研究通讯ID&#xff1a;jxsdyjtx…

php 实现类,php 获取页面中指定内容的实现类

本文为大家下使用php如何获取页面中的指定内容&#xff0c;而且以封装成类&#xff0c;需要的朋友可以参考下本文功能&#xff1a;1.获取内容中的url&#xff0c;email&#xff0c;image。2.替换内容中的url&#xff0c;email&#xff0c;image。url&#xff1a;xxxemail&#…

FastTunnel-开源内网穿透框架

FastTunnelFastTunnel是用.net core开发的一款跨平台内网穿透工具&#xff0c;它可以实现将内网服务暴露到公网供自己或任何人访问。与其他穿透工具不同的是&#xff1a;FastTunnel项目致力于打造一个易于扩展、易于维护的内网穿透框架&#xff0c;任何人都可以基于该框架二次开…

系统架构师-基础到企业应用架构-服务层

一、上章回顾 上篇我们主要讲解了系统架构中的四种架构模式&#xff0c;并且分析了四种架构模式的实现及应用场景&#xff0c;那么先来回顾下架构中的业务逻辑层的使用及总结。 如果大家对图中讲述的内容不明白或者说是不深入那么可以参考上篇讲 解的内容&#xff1a;系统架构师…

Python 10大谬论

全世界只有3.14 % 的人关注了数据与算法之美谬误 #1: Python 是一门新语言伴随着所有的初创公司正在使用它以及孩子们最近也在学习它的事实&#xff0c;这个谬误为何仍然存在是可以理解的。实际上 Python 已经 超过23岁了, 它最初发布于1991年, 早于 HTTP 1.0协议 5年且早于 Ja…

【litrpa专题】首个rpa程序,使用litrpa采集百度地图地铁数据

RPA最近2年里红遍大江南北&#xff0c;人力成本上升&#xff0c;办公自动化势在必行&#xff0c;Excel长期肩负着办公自动化的重任&#xff0c;就算有【Excel催化剂】这些插件的把持&#xff0c;仍然有许多需求未能满足。笔者一直关注RPA领域&#xff0c;从广义来说&#xff0c…

不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?

▲数据汪特别推荐点击上图进入玩酷屋之前小木推荐“德国MINICUTE人体工学腰垫”受到了大家一致的好评和争相购买。小木为什么推荐这一款原因是&#xff1a;据统计&#xff0c;我国腰椎病患者已经突破2亿人。30~40岁人群中&#xff0c;患有颈腰椎病的占比59.1%&#xff01;而且有…

Python花呗分析模型温馨提醒:支出不规范,收入两行泪

全世界只有3.14 % 的人关注了数据与算法之美春节结束&#xff0c;离开家里混吃混喝的怀抱&#xff0c;我又开始了用花呗、还花呗的无限循环。花呗给人一种“有钱”的感觉&#xff0c;我不禁思考&#xff1a;像我这种发工资前靠花呗活着&#xff0c;一发工资就还花呗的平静什么时…

fiddler插件开发

Fiddler 是优秀的抓包工具&#xff0c;有着众多的优秀插件。Fiddler 软件是由C#语言开发的&#xff0c;运行在.net Framework 框架之上&#xff0c;所以我们也可以使用vs来开发自己的Fiddler插件&#xff0c;下面就介绍fiddler插件开发基本步骤。1.打开visual studio 创建一个V…

2500 万行的代码就问你敢不敢动?!

全世界只有3.14 % 的人关注了数据与算法之美近日&#xff0c;某网友在 Hacker News 上发起了一个 “你见过的最糟糕的代码是什么&#xff1f;” 的问题&#xff0c;引起了广泛关注和讨论&#xff0c;评论数已接近600条。其中&#xff0c;一位 ID 为“oraguy”的程序员对 Oracle…

WPF Grid添加边框的两种方法

最近项目中使用到了Grid表格&#xff0c;居然要加边框&#xff0c;查了一下&#xff0c;grid原生居然是不支持实线边框的。。最终我还是实现了效果&#xff0c;看看吧&#xff1a;左边是直接写的每行一个border,每列写一个border,这样在行列比较少的时候还行&#xff0c;如果多…

当初互联网大佬给的几块钱“羊毛”,现在又要我们加倍还回去!

全世界只有3.14 % 的人关注了数据与算法之美对于上班族来说&#xff0c;春节早就过去了&#xff0c;今天已经是上班的第N天了。不知道大家在春节七天有没有走进电影院呢&#xff1f;在春节档期的八部电影各有各的特色&#xff0c;数据汪一一看完之后真是爽歪歪&#xff01;但是…

在 dotnet runtime 的容器中安装 dotnet global tool

在 dotnet runtime 的容器中安装 dotnet global toolIntro.NET Core 从 2.1 开始支持 Global tool, 借助 global tool 我们可以通过命令行来实现很多功能&#xff0c;微软提供的一系列的 dotnet 诊断工具也都提供了 global tool&#xff0c;我们可以通过 global tool 比较方便的…

Asymptote 学习记录(2):例子阅读

学习编程的一个有效方式是去读别人写的代码.我学习了这里的代码.代码虽多,但是简单.代码如下(稍微做了修改): import settings; pdfviewer"/usr/bin/okular"; outformat"pdf"; size(400); texpreamble("\usepackage{CJK}\AtBeginDocument{\begin{CJK}…

如何启发孩子的数学思维?你想要的答案或许在这!

▲数据汪特别推荐点击上图进入玩酷屋记得寒假时&#xff0c;超模君七岁小表弟来问了我一道题目&#xff1a;下面线段有多少条&#xff1f;首先我问了他什么是线段&#xff1f;他说&#xff1a;两端有端点&#xff0c;不可以伸长的直线。AB就是线段。我慢慢引导&#xff0c;假如…

.NET Core 服务在 ARM64 服务器中的部署

Linux 服务器 CPU 架构主要可分为&#xff1a;X86_64/AMD64、ARM64/AARCH64 两大类&#xff0c;大多情况使用的都是基于 AMD64 CPU 架构的服务器。但随着国产操作系统、CPU 等自主生态打造的应用产品得到越来越多的用户认可和应用&#xff0c;如&#xff1a;华为鲲鹏、统信 UOS…

php 读取onedrive文件夹,oneindex

oneindexOnedrive Directory Index功能&#xff1a;不用服务器空间&#xff0c;不走服务器流量&#xff0c;直接列onedrive目录&#xff0c;文件直链下载。demochange log:18-03-29: 更新直链获取机制、缓存机制&#xff0c;避免频繁访问的token失效18-03-29: 解决非英文编码问…