閱讀本文,你可以了解如何撰寫開發和除錯 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 協議,意味著允許任何人任何組織和企業任意處置,包括使用,復制,修改,合并,發表,分發,再授權,或者銷售,在倉庫里面包含了完全的構建邏輯,只需要本地的網路足夠好(因為需要下載一堆構建工具),即可進行本地構建
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/287720.html
標籤:WPF
