WPF 框架开发 调试和开发 XAML 构建过程的 PresentationBuildTasks 方法
阅读本文,你可以了解如何编写开发和调试 XAML 构建为 Baml 和 g.cs 文件的过程和工具。本文也适合想要了解 WPF 的 XAML 构建过程的开发者阅读,本文提供了可以断点调试 WPF 的 XAML 构建过程的方法和代码
本文非新手友好,有大量构建和预编译知识,请在阅读本文之前自行了解这部分知识。更多请看 手把手教你写 Roslyn 修改编译
在 WPF 中,构建 XAML 用的是 PresentationBuildTasks 任务进行构建,核心使用的是 dotnet sdk 提供的构建调度功能,将 XAML 的构建调度到 PresentationBuildTasks 任务,由此工具进行构建。使用 PresentationBuildTasks 任务可以构建出 Baml 和 g.cs 等文件
在 WPF 开源仓库里面,包含了 PresentationBuildTasks 的所有源代码。在 dotnet sdk 里面,包含了调试 XAML 构建的后门,允许开发者指定 PresentationBuildTasks 为自己的开发版本
下面以调试 Walterlv.Demo.XamlProperties 测试项目的 XAML 构建过程作为例子,告诉大家如何让 dotnet 在构建 WPF 项目时,使用自定义的 PresentationBuildTasks 任务进行构建
先在 Walterlv.Demo.XamlProperties.csproj 文件里面添加如下代码
<PropertyGroup>
<_PresentationBuildTasksTfm Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp2.1</_PresentationBuildTasksTfm>
<_PresentationBuildTasksTfm Condition="'$(MSBuildRuntimeType)' != 'Core'">net472</_PresentationBuildTasksTfm>
<_PresentationBuildTasksAssembly>$(MSBuildThisFileDirectory)..\PresentationBuildTasks\bin\Debug\$(_PresentationBuildTasksTfm)\PresentationBuildTasks.dll</_PresentationBuildTasksAssembly>
</PropertyGroup>
以上的代码的 _PresentationBuildTasksAssembly 属性需要修改为你自己的 PresentationBuildTasks 代码构建出来的输出文件路径。在 dotnet 里面,如果在 VisualStudio 里面,那么将加载 .NET Framework 4.7.2 版本的 PresentationBuildTasks.dll 的文件。如果是在命令行执行 dotnet build 命令,此时将加载 .NET Core 2.1 的 PresentationBuildTasks.dll 的文件。此部分知识请参阅 从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目) - walterlv 和 在项目文件 / MSBuild / NuGet 包中编写扩展编译的时候,正确使用 props 文件和 targets 文件 - walterlv 和 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - walterlv
而 PresentationBuildTasks 的代码可以从 WPF 开源仓库里面的 src\Microsoft.DotNet.Wpf\src\PresentationBuildTasks 文件夹拿到代码,只是这里面的代码构建需要做一些配置
我给大家提供了我的版本,此版本包含了 Walterlv.Demo.XamlProperties 测试项目本身,使用方法是将我的代码拉到你的本地。请在使用时,安装好 .NET 5 或更新版本的 SDK 然后将你的需要测试的 XAML 文件和代码加入到 Walterlv.Demo.XamlProperties 测试项目里面。先打开 PresentationBuildTasks.sln 项目,接着使用命令行 dotnet build 构建 Walterlv.Demo.XamlProperties 测试项目
构建时将会弹出 VisualStudio 附加进程调试窗口,选择使用 PresentationBuildTasks.sln 所在的 VisualStudio 进行调试,下一步按下 F10 就可以看到 PresentationBuildTasks 的源代码
获取以上调试版本的方法是先创建一个本地源代码文件夹,此文件夹是一个空文件夹,用来从 GitHub 上拉我的代码。先使用命令行进入到此空文件夹,接下来输入以下代码用来拉代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin e9982404d4b51f184f483ba8663ee160befdc8e8
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源
git remote add origin https://github.com/lindexi/lindexi_gd.git
以上代码包含了作为测试项目的 Walterlv.Demo.XamlProperties.csproj 文件,以及我从 WPF 项目里面拷贝的 PresentationBuildTasks 代码。对比放在 WPF 项目的 PresentationBuildTasks 的代码,我提供的测试代码是没有 WPF 项目的依赖的,不仅构建方便,同时构建速度也快
当然缺点是没有更上 WPF 的源代码版本,需要大家自己手动去拷贝最新的代码
本文提供的代码,其实是准备调试 AttachedProperty cannot be assigned in a XAML file if it is declared in the same project. · Issue #4544 · dotnet/wpf
欢迎大家参与 WPF 框架的开发
当前的 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好的 MIT 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。在仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建
WPF 框架开发 调试和开发 XAML 构建过程的 PresentationBuildTasks 方法的更多相关文章
- Android开发调试无法连接到夜神模拟器的解决方法
Android开发调试无法连接到夜神模拟器的解决方法: 一般原因是adb的版本不一致造成的!!!!!换成一样的就可以了. 在网上看到的方法,特记录下来: 1.任务管理器里看下,adb.exe以及nox ...
- 在cocos code ide的基础上构建自己的lua开发调试环境
对于一种语言,其所谓开发调试环境, 大体有以下两方面的内容: 1.开发, 即代码编写, 主要是代码提示.补齐, 更高级一点的如变量名颜色等. 2.调试, 主要是运行状态下断点.查看变量.堆栈等. 现在 ...
- 玩转VSCode-完整构建VSCode开发调试环境
随着VSCode的不断完善和强大,是时候将部分开发迁移到VS Code中了. 目前使用VS2019开发.NET Core应用,一直有一个想法,在VS Code中复刻VS的开发环境,同时迁移到VS Co ...
- AngularJS开发指南16:AngularJS构建大型Web应用详解
AngularJS是由Google创建的一种JS框架,使用它可以扩展应用程序中的HTML功能,从而在web应用程序中使用HTML声明动态内容.在该团队工作的软件工程师Brian Ford近日撰写了一篇 ...
- 【本人译作推荐】Windows 8应用开发:C#和XAML卷(原名:Building Windows 8 Apps with C# and XAML)
[图书推荐] 译名:Windows 8应用开发:C#和XAML卷 原名:Building Windows 8 Apps with C# and XAML 编辑推荐 国内第一本使用XAML与C#语言 ...
- Xamarin.Forms移动开发系列4 :XAML基础
摘要 本文介绍Xamarin.Forms创建用户界面的语言:XAML基础部分. 前言 本文介绍Xamarin.Forms定义用户界面的语言:XAML. 本篇篇幅较长,主要讲述XAML语法,以及对其他基 ...
- .net core/5/6/7中WPF如何优雅的开始开发
WPF是微软的.net平台中的一个桌面客户端应用程序框架,经常用于企业开发windows桌面客户端,广泛应用于中小企业快速开发一款工具,本人也是比较喜欢利用WPF开发一些小工具. 目录 知名案例 .n ...
- 渐进式框架、自底向上增量开发的vue
官网对vue.js的介绍是这样的: 一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. 那么到底什么是渐进式框架.自底向上增量开发又是什么呢? 其实我觉得这 ...
- 搭建Hadoop2.5.2+Eclipse开发调试环境
一.简介 为了开发调试方便,本文介绍在Eclipse下搭建开发环境,连接和提交任务到Hadoop集群. 二.安装前准备: 1)Eclipse:Luna 4.4.1 2)eclipse插件:hadoop ...
- 10个Visual Studio原生开发调试技巧
10个Visual Studio原生开发调试技巧(1) 2013-05-29 13:30 佚名 开源中国 我要评论(1) 字号:T | T 以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来 ...
随机推荐
- Go | 浅谈包管理模式
任何一门编程语言都离不开对各种工具包的使用,工具包的管理就显得异常重要了.Go 的包管理方式是逐渐演进的,本文介绍Go语言的两种包管理模式. GOPATH模式引包(不推荐) 在 1.5 版本之前,所有 ...
- 在使用若依分离版时遇到富文本不显示html解决
<el-table-column label="公告内容" align="center" prop="content"> < ...
- KingbaseES 数据插入更新操作
数据库使用过程中,经常会遇到一种场景:业务系统对数据进行dml操作,当数据库中数据不存在时,将数据做为新记录插入到表中,当数据库中数据存在时,对现有数据进行更新操作. 下面介绍KingbaseES中对 ...
- KingbaseES V8R6 集群运维案例之 -- VIP配置错误导致集群切换失败
案例说明: KingbaseES V8R6集群的vip在repmgr.conf中配置,本案例测试了手工卸载和加载vip的操作,对failover切换时vip的卸载和加载的影响. 适用版本: Kingb ...
- UE4 c++ -- 简单的UMG
说明 学习一下如何将Widget蓝图与C++连接起来,将处理逻辑写在C++中 基础 在蓝图中,我们显示Widget是通过一个Actor或者PlayerController,甚至关卡蓝图,利用Creat ...
- layui框架使用单页面弹出层组件layer
layui实现单页面弹出层 首先需要导入layui的js和css: <link rel="stylesheet" href="layui/css/layui.css ...
- 【已解决】ajax和flask路由传json格式数据出现undefined和object错误
描述一下问题背景: 前台封装一个json字符串给后台传输数据,后台的ajax获取请求之后把接收的数据显示到前台html表格上. jsonify:这个方法可以把字典转化为json字符串 通过jsonif ...
- 企业数据清洗项目实践day1
今天先把国标excel表的数据在Python里转化成了字典类型, 暂时定共分为四层,层层分类. 代码 1 def std_excel(): 2 dict={"A":{"0 ...
- MyBatis的映射关系
MyBatis的映射关系是有一个默认的,采用下划线命名的方式将数据库表的列名按照驼峰式映射成 Java 实体类的属性名 举个例子数据库表名为 tb_user,其中的字段名为 inst_code,对应的 ...
- 详解SSL证书系列(9)SSL客户端认证
上一篇介绍了HTTPS和HTTP协议的区别,理解了HTTP加上加密处理和认证以及完整性保护后即是HTTPS,同时HTTPS也是身披SSL外壳的HTTP,那么SSL客户端认证是怎么回事呢?这篇文章我将带 ...