WinUI 3 踩坑记:从创建项目到发布
本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,若内容出现冲突以 GitHub 上的为准。
创建项目
现在 WinUI 3 的入门体验比刚发布那会儿好太多了,至少不会再出现模板项目无法生成的情况 [1]。打开 Visual Studio 创建 WinUI 3 项目,有如下的三个模板可以选择:
第一个模板的 WinUI 3 项目和打包项目是同一个项目,第三个模板的则是两个不同的项目。如果在发布时需要让多个可执行文件存在于不同文件夹,就选择第三个模板。
打包与非打包
WinUI 3 默认创建打包项目,打包发布需要使用被用户设备信任的证书给包签名,如果要发布非打包的项目,在项目文件(*.csproj)中加入以下内容即可 [2]。
<!-- *.csproj -->
<PropertyGroup>
......
<!-- 不打包 -->
<WindowsPackageType>None</WindowsPackageType>
<!-- 自包含 Windows App SDK Runtime,否则需要单独安装 -->
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
</PropertyGroup>
优缺点
优点 | 缺点 | |
---|---|---|
打包 | 操作系统保证包内文件不会被篡改 | 需要代码签名 |
非打包 | 部署灵活 | 无法使用与应用包有关的 API |
发布
创建项目后,会在文件夹 ./Properties/PublishProfiles/
内创建三个不同 CPU 架构的发布配置文件,下面以 x64 平台的为例。
<!-- win10-x64.pubxml -->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PublishProtocol>FileSystem</PublishProtocol>
<Platform>x64</Platform>
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
<PublishDir>bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\</PublishDir>
<!-- 自包含 .NET 运行时 -->
<SelfContained>true</SelfContained>
<!-- 不要发布为单个文件 -->
<PublishSingleFile>False</PublishSingleFile>
<!-- Release 配置时使用 ReadyToRun 编译 -->
<PublishReadyToRun Condition="'$(Configuration)' == 'Debug'">False</PublishReadyToRun>
<PublishReadyToRun Condition="'$(Configuration)' != 'Debug'">True</PublishReadyToRun>
<!-- 暂时不能使用剪裁 -->
<!--
See https://github.com/microsoft/CsWinRT/issues/373
<PublishTrimmed>True</PublishTrimmed>
-->
</PropertyGroup>
</Project>
自包含和 ReadyToRun 编译让 WinUI 3 安装包的体积不逊于 Electron,尽管现在硬盘空间很宽裕,但是在打包后还是要注意一下安装包的大小,因为第三方库可能会引入 WinForm 和 WPF 的框架文件。
这里以云之幻的网络回环管理器为例,项目中引用的第三方库仅有四个,但是安装包大小却有 90.3 MB。
<!-- LoopbackManager.App.csproj -->
<PackageReference Include="PInvoke.User32" Version="0.7.124" />
<PackageReference Include="ReactiveUI" Version="18.3.1" />
<PackageReference Include="ReactiveUI.Fody" Version="18.3.1" />
<PackageReference Include="ReactiveUI.WinUI" Version="18.3.1" />
打开安装后应用的文件夹,以文件大小排序,发现几个眼熟的东西,这不就是 WinForm 和 WPF 的吗。(图中仅截取了前几个,后面还有更多)
究其原因,在项目中有这样一条引用链:网络回环管理器 -> ReactiveUI -> DynamicData ->System.Reactive
,而在 System.Reactive
的项目文件中有这样一段,导致在 WinUI 3 项目中会引入 WinForm 和 WPF 的框架文件。
<!-- System.Reactive.csproj -->
<PropertyGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1' or $(TargetFramework.StartsWith('net5.0-windows'))">
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
<IncludeBuildOutput Condition="'$(TargetFramework)' == 'netcoreapp3.1'">false</IncludeBuildOutput>
</PropertyGroup>
可惜的是,除了不引用这些第三方库以外,我暂时还没有找到在打包项目中解决这个问题的办法。
不同条件下的应用大小
因为有可能会引入额外的框架文件,我测试了 WinUI 3 模板项目在不同发布条件下的大小,帮各位读者排排雷。
这里的 2W 是指 WinForm 和 WPF,在我的测试中,如果仅使用 UseWindowsForms
或 UseWPF
,额外引入的框架文件是一样的,所以不对二者进行区分。
WindowsAppSDK
是指项目文件中 WindowsAppSDKSelfContained = true
的情况,用户在安装打包项目的安装包时(msix 或 msixbundle 文件),系统会自动下载并安装 Windows App SDK Runtime。但是非打包项目没有这个福利,所以这一项仅供非打包项目参考。
安装包 | 安装后 | |
---|---|---|
WinUI | 40.4 MB | 101 MB |
WinUI + ReadyToRun | 51.1 MB | 138 MB |
WinUI + WindowsAppSDK | 59.6 MB | 155 MB |
WinUI + WindowsAppSDK + ReadyToRun | 70.3 MB | 193 MB |
WinUI + 2W | 75.5 MB | 188 MB |
WinUI + 2W + ReadyToRun | 86.2 MB | 225 MB |
WinUI + 2W + WindowsAppSDK | 94.7 MB | 242 MB |
WinUI + 2W + WindowsAppSDK + ReadyToRun | 105.0 MB | 279 MB |
额外引入的内容
下表列出了额外引入 WinForm 和 WPF 框架时多出的文件或文件夹。
点击展开
文件或文件夹名称 |
---|
cs/ |
de/ |
es/ |
fr/ |
it/ |
ja/ |
ko/ |
pl/ |
pt-BR/ |
ru/ |
tr/ |
zh-Hans/ |
zh-Hant/ |
Accessibility.dll |
D3DCompiler_47_cor3.dll |
DirectWriteForwarder.dll |
Microsoft.VisualBasic.Forms.dll |
Microsoft.Win32.Registry.AccessControl.dll |
Microsoft.Win32.SystemEvents.dll |
PenImc_cor3.dll |
PresentationCore.dll |
PresentationFramework.Aero.dll |
PresentationFramework.Aero2.dll |
PresentationFramework.AeroLite.dll |
PresentationFramework.Classic.dll |
PresentationFramework.dll |
PresentationFramework.Luna.dll |
PresentationFramework.Royale.dll |
PresentationFramework-SystemCore.dll |
PresentationFramework-SystemData.dll |
PresentationFramework-SystemDrawing.dll |
PresentationFramework-SystemXml.dll |
PresentationFramework-SystemXmlLinq.dll |
PresentationNative_cor3.dll |
PresentationUI.dll |
ReachFramework.dll |
System.CodeDom.dll |
System.Configuration.ConfigurationManager.dll |
System.Design.dll |
System.Diagnostics.EventLog.dll |
System.Diagnostics.EventLog.Messages.dll |
System.Diagnostics.PerformanceCounter.dll |
System.DirectoryServices.dll |
System.Drawing.Common.dll |
System.Drawing.Design.dll |
System.IO.Packaging.dll |
System.Printing.dll |
System.Resources.Extensions.dll |
System.Security.Cryptography.Pkcs.dll |
System.Security.Cryptography.ProtectedData.dll |
System.Security.Cryptography.Xml.dll |
System.Security.Permissions.dll |
System.Threading.AccessControl.dll |
System.Windows.Controls.Ribbon.dll |
System.Windows.Extensions.dll |
System.Windows.Forms.Design.dll |
System.Windows.Forms.Design.Editors.dll |
System.Windows.Forms.dll |
System.Windows.Forms.Primitives.dll |
System.Windows.Input.Manipulations.dll |
System.Windows.Presentation.dll |
System.Xaml.dll |
UIAutomationClient.dll |
UIAutomationClientSideProviders.dll |
UIAutomationProvider.dll |
UIAutomationTypes.dll |
vcruntime140_cor3.dll |
WindowsFormsIntegration.dll |
wpfgfx_cor3.dll |
引用
- [1] WindowsAppSDK: .NET 6 and WINUI3 fails to start Unable to load DLL 'Microsoft.ui.xaml.dll'
- [2] 非 MSIX 打包:为非 MSIX 打包的 C# 或 C++ WinUI 3 桌面应用创建一个新项目
WinUI 3 踩坑记:从创建项目到发布的更多相关文章
- WinUI 3 踩坑记:前言
WinUI 3 (Windows App SDK 于 2021 年 11 月发布了第一个正式版 v1.0.0 [1],最新版本是 v1.1.5 [2].我的基于 WinUI 3 的个人项目 寻空 从年 ...
- WinUI 3 踩坑记:第一个窗口
本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,文中的代码也在此仓库中,若内容出现冲突以 GitHub 上的为准. WinUI 3 应用的 ...
- ASP.NET+MVC入门踩坑笔记 (一) 创建项目 项目配置运行 以及简单的Api搭建
哈喽各位 我又回来了! 前段时间研究了下ASP.NET,刚开始也是随便找网上的各种教程来看,但是鉴于本人技术有限,还是走了相当长的一段弯路的.所以我写下了这篇文章.希望各位刚刚入坑的ASP.NET开发 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- Spark踩坑记——共享变量
[TOC] 前言 Spark踩坑记--初试 Spark踩坑记--数据库(Hbase+Mysql) Spark踩坑记--Spark Streaming+kafka应用及调优 在前面总结的几篇spark踩 ...
- Spark踩坑记——从RDD看集群调度
[TOC] 前言 在Spark的使用中,性能的调优配置过程中,查阅了很多资料,之前自己总结过两篇小博文Spark踩坑记--初试和Spark踩坑记--数据库(Hbase+Mysql),第一篇概况的归纳了 ...
- Spark踩坑记:Spark Streaming+kafka应用及调优
前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从k ...
- Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记
前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...
- centos 7( linux )下搭建elasticsearch踩坑记
原文:https://blog.csdn.net/an88411980/article/details/83150380 概述 公司最近在做全文检索的项目,发现elasticsearch踩了不少 ...
随机推荐
- 数组基础篇(对应C++ Primer plus 4.10)
概要:数组是由一组同类型的元素组成的集合,在内存上是一片连续的存储空间.C++提供了三种数组的表示方法:普通数组,模板类vector(C++98 新增的标准模板库STL提供该模板类)和模板类array ...
- 快来体验快速通道,netty中epoll传输协议详解
目录 简介 epoll的详细使用 EpollEventLoopGroup EpollEventLoop EpollServerSocketChannel EpollSocketChannel 总结 简 ...
- [ERROR] Another process with pid 914 is using unix socket file.
mysql启动报错 1.首先到mysql的配置文件中,确定socket文件路径 vim /etc/my.cnf 2.删除mysql.sock.lock 3.启动mysql
- 我已经说了5种css居中实现的方式了,面试官竟然说还不够?
这是一篇关于居中对齐方式的总结 开篇之前,先问一下大家都知道几种居中的实现方式? 面试时答出来两三个就不错了,就怕面试官还让你继续说.今天就来总结一下这些居中的方式 使用flex布局设置居中. 使用f ...
- 如何在Excel/WPS表格中批量查询快递信息?
如何在Excel/WPS表格中批量查询快递信息? 干电商的小伙伴们还在为如何批量查询快递物流信息发愁吗?别着急,这篇文章或许能够帮助到您. 首先给大家看一下查询的具体成果: 第一步:安装Excel网络 ...
- 启用Hyper-v后,重启后界面提示 无法完成功能配置,正在撤销更改
安装docker后,提示需要启用hyper-v,在控制面板中勾选Hyper-v,然后重启,更新快完成就提示无法完成功能配置,正在撤销更改 解决方法 方法1 控制面板一个一个选 方法2 百度了n多内容, ...
- SQL语句编写
mybatis插入数据 下面的item.avatarUrl取出的是java实体类里面的属性,所有需要大写 插入的SQL: INSERT INTO `one` VALUES(1,"第一个&qu ...
- 无意苦争春,一任群芳妒!M1 Mac book(Apple Silicon)能否支撑全栈工程师的日常?(Python3/虚拟机/Docker/Redis)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_187 就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:"不好意思,虽然 ...
- 【原创】Selenium获取请求头、响应头
本文仅供学习交流使用,如侵立删! Selenium获取请求头.响应头 操作环境 win10 . mac Python3.9 selenium.seleniumwire selenium是没有办法直接获 ...
- show create table底层流程跟踪
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 SHOW CREATE TABLE语句用于为指定表/视图显示创建的语句,本文将简要描述如何在MySQL源码里跟踪和学 ...