Sdk 風格的 csproj 對 WPF/UWP 支持不太好?有第三方 SDK 可以用!MSBuild.Sdk.Extras

自從微軟推出 .NET Core 以來,新的項目文件格式以其優秀的可擴展性正吸引着更多項目採用。然而——微軟官方的 WPF/UWP 項目模板依然還在採用舊的 csproj 格式!

這只是因爲——在 .NET Core 3.0 以前,基於 Microsoft.NET.Sdk 的官方 SDK 依然對 WPF/UWP 支持不夠友好。


爲什麼要使用第三方的 SDK?

關於項目文件格式的遷移,我和 林德熙 都寫過文章:

不過,這兩篇文章中的遷移方法都是手動或半自動遷移的。而且遷移完畢之後,對新增的 WPF/UWP XAML 文件的支持非常不友好——新增的 XAML 文件是看不見的,除非手工去 csproj 文件中去掉自動生成的 Remove XAML 的代碼。

這確實阻礙着我們在 WPF/UWP 項目中體會到新風格 csproj 的好處。

微軟在 Build 2018 大會上宣佈,WPF/UWP 將能夠在 .NET Core 3 中運行。想必,微軟會爲未來版本的 Microsoft.NET.Sdk 這樣的官方 SDK 添加更多的 WPF/UWP 這類格式的支持吧!即便沒有這樣的原生支持,想必也會提供官方的擴展方案。

但在此之前呢?感謝小夥伴 KodamaSakuno (神樹桜乃) 提醒我第三方 SDK 的存在 —— MSBuild.Sdk.Extras。我想,在 .NET Core 3 推出之前,這是一種不錯的中轉方案。既能體會到新風格 csproj 格式的好處,也能在將來 .NET Core 3 官方支持後較快地遷移成官方版本。

如何使用 MSBuild.Sdk.Extras

雖說是第三方 SDK,但實際使用的方便程度卻如官方般簡潔!只需要將 SDK 替換成 MSBuild.Sdk.Extras/1.6.41 即可。1.6.41 是目前 MSBuild.Sdk.Extras 在 NuGet 上的最新版本,建議訪問 NuGet Gallery - MSBuild.Sdk.Extras 使用最新穩定版本。

以下是最簡同時支持 WPF 和 UWP 雙框架的代碼:

<Project Sdk="MSBuild.Sdk.Extras/1.6.41">
  <PropertyGroup>
    <TargetFrameworks>net471;uap10.0.17134</TargetFrameworks>
  </PropertyGroup>
</Project>

▲ 在剛剛指定完 uap10.0.17134 之後,等待 Visual Studio 還原需要等待好幾分鐘。

另外,從 1.6.0 版本開始,爲 WPF 和 Windows Forms 分別新增了一個屬性,用於默認引用 WPF 或 Windows Forms 所需的程序集。

<Project Sdk="MSBuild.Sdk.Extras/1.6.41">
  <PropertyGroup>
    <TargetFramework>net471</TargetFramework>
    <!-- 以下是默認引用 WPF 相關依賴的屬性 -->
    <ExtrasEnableWpfProjectSetup>true</ExtrasEnableWpfProjectSetup>
    <!-- 以下是默認引用 Windows Forms 相關依賴的屬性 -->
    <!-- <ExtrasEnableWinFormsProjectSetup >true</ExtrasEnableWinFormsProjectSetup> -->
  </PropertyGroup>
</Project>

從下圖我們可以看出,設置 ExtrasEnableWpfProjectSetuptrue 後,WPF 的類型將直接可用,而無需額外引用。(當然,不設置也是可以的,只是需要手動引用。)

在這裏插入圖片描述

沒錯,真的如此簡單!在我們猜測的 .NET Core 3 支持 WPF/UWP 項目格式之前,這應該算是最簡單的遷移方案了!

至於項目結構的效果,可以看下圖所示(包含 UWP 的多目標):

在這裏插入圖片描述

相比於此前的手工遷移,使用此新格式創建出來的 XAML 文件是可見的,而且 .xaml.cs 也是摺疊在 .xaml 之下,且能正常編譯!(當然,咱們還得考慮 UWP 和 WPF 在 XAML 書寫上的細微差異)

官方提供了更多的使用方法,例如更簡單的是安裝 NuGet 包,而不修改 SDK。詳見:onovotny/MSBuildSdkExtras: Extra properties for MSBuild SDK projects

參考資料


我的博客會首發於 https://blog.walterlv.com/,而 CSDN 會從其中精選發佈,但是一旦發佈了就很少更新。

如果在博客看到有任何不懂的內容,歡迎交流。我搭建了 dotnet 職業技術學院 歡迎大家加入。

知識共享許可協議

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名呂毅(包含鏈接:https://walterlv.blog.csdn.net/),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫

發佈了420 篇原創文章 · 獲贊 254 · 訪問量 55萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章