当前位置: 首页 > news >正文

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

自从微软推出 .NET Core 以来,新的项目文件格式以其优秀的可扩展性正吸引着更多项目采用。然而——微软官方的 WPF/UWP 项目模板依然还在采用旧的 csproj 格式!

这只是因为——在 .NET Core 3.0 以前,基于 Microsoft.NET.Sdk 的官方 SDK 依然对 WPF/UWP 支持不够友好。


本文内容

    • 为什么要使用第三方的 SDK?
    • 如何使用 MSBuild.Sdk.Extras

为什么要使用第三方的 SDK?

关于项目文件格式的迁移,我和 林德熙 都写过文章:

  • 从以前的项目格式迁移到 VS2017 新项目格式 - 林德熙
  • 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成 Sdk 风格的 csproj - 吕毅

不过,这两篇文章中的迁移方法都是手动或半自动迁移的。而且迁移完毕之后,对新增的 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。

参考资料

  • onovotny/MSBuildSdkExtras: Extra properties for MSBuild SDK projects

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 为博客或个人站点的 Markdown 添加 LaTeX 公式支持
  • 如何让 .NET Core 命令行程序接受密码的输入而不显示密码明文
  • 如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效
  • PasswordVault —— 在 UWP 应用中安全地保存密码
  • 如何在 MSBuild Target(Exec)中报告编译错误和编译警告
  • 将 .NET Core 项目打一个最简单的 NuGet 源码包,安装此包就像直接把源码放进项目一样
  • 使用 LINQ to XML,.NET 让生成 XML 文件变得和直接写 XML 一样轻松
  • git subtree 不断增加的推送时间,解不玩的冲突!这篇文章应该能救你
  • 阻止某个 NuGet 包意外升级
  • 解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程
  • 在 Visual Studio 的解决方案资源管理器中隐藏一些文件
  • 长期支持 LTS(Long-term Support)是怎样的一种支持方式
  • .NET Standard 的管理策略
  • 如何在 .NET/C# 代码中安全地结束掉一个控制台应用程序?通过发送 Ctrl+C 信号来结束
  • Windows 10 应用创建模糊背景窗口的三种方法
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • crontab执行失败的多种原因
  • JavaScript HTML DOM
  • JavaScript函数式编程(一)
  • Just for fun——迅速写完快速排序
  • PHP CLI应用的调试原理
  • socket.io+express实现聊天室的思考(三)
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Terraform入门 - 3. 变更基础设施
  • Tornado学习笔记(1)
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue自定义指令实现v-tap插件
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 力扣(LeetCode)965
  • 排序(1):冒泡排序
  • 在weex里面使用chart图表
  • 字符串匹配基础上
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #android不同版本废弃api,新api。
  • (26)4.7 字符函数和字符串函数
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (超详细)语音信号处理之特征提取
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)我也是一只IT小小鸟
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET MVC第三章、三种传值方式
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @property括号内属性讲解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [BUUCTF 2018]Online Tool(特详解)
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [GN] Vue3快速上手1
  • [go 反射] 进阶