本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,若内容出现冲突以 GitHub 上的为准。

创建项目

现在 WinUI 3 的入门体验比刚发布那会儿好太多了,至少不会再出现模板项目无法生成的情况 [1]。打开 Visual Studio 创建 WinUI 3 项目,有如下的三个模板可以选择:

第一个模板的 WinUI 3 项目和打包项目是同一个项目,第三个模板的则是两个不同的项目。如果在发布时需要让多个可执行文件存在于不同文件夹,就选择第三个模板。

打包与非打包

WinUI 3 默认创建打包项目,打包发布需要使用被用户设备信任的证书给包签名,如果要发布非打包的项目,在项目文件(*.csproj)中加入以下内容即可 [2]。

......

None

true

优缺点

优点

缺点

打包

操作系统保证包内文件不会被篡改

需要代码签名

非打包

部署灵活

无法使用与应用包有关的 API

发布

创建项目后,会在文件夹 ./Properties/PublishProfiles/ 内创建三个不同 CPU 架构的发布配置文件,下面以 x64 平台的为例。

FileSystem

x64

win10-x64

bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\

true

False

False

True

自包含和 ReadyToRun 编译让 WinUI 3 安装包的体积不逊于 Electron,尽管现在硬盘空间很宽裕,但是在打包后还是要注意一下安装包的大小,因为第三方库可能会引入 WinForm 和 WPF 的框架文件。

这里以云之幻的网络回环管理器为例,项目中引用的第三方库仅有四个,但是安装包大小却有 90.3 MB。

打开安装后应用的文件夹,以文件大小排序,发现几个眼熟的东西,这不就是 WinForm 和 WPF 的吗。(图中仅截取了前几个,后面还有更多)

究其原因,在项目中有这样一条引用链:网络回环管理器 -> ReactiveUI -> DynamicData ->System.Reactive,而在 System.Reactive 的项目文件中有这样一段,导致在 WinUI 3 项目中会引入 WinForm 和 WPF 的框架文件。

true

true

false

可惜的是,除了不引用这些第三方库以外,我暂时还没有找到在打包项目中解决这个问题的办法。

不同条件下的应用大小

因为有可能会引入额外的框架文件,我测试了 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踩了不少 ...

随机推荐

EasyExcel导出创建Excel下拉框

话不多说,上才艺. 下面代码粘贴即用 /** * * 导出表格带下拉框 */ @GetMapping("exportBox") public void export(HttpSer ...

IntelliJ IDEA 项目文件旁边都有0%classes,0% lines covered

IntelliJ IDEA 项目文件旁边都有0%classes,0% lines covered,解决方法:http://yayihouse.com/yayishuwu/chapter/2247

论文阅读 GloDyNE Global Topology Preserving Dynamic Network Embedding

11 GloDyNE Global Topology Preserving Dynamic Network Embedding link:http://arxiv.org/abs/2008.01935 ...

用面向对象的方式操作 JSON 甚至还能做四则运算 JSON 库

前言 在之前实现的 JSON 解析器中当时只实现了将一个 JSON 字符串转换为一个 JSONObject,并没有将其映射为一个具体的 struct:如果想要获取值就需要先做断言将其转换为 map 或 ...

windows版anaconda+CUDA9.0+cudnn7+pytorch+tensorflow安装

1.Anaconda 首先下载Anaconda,它是一个开源的python发行版本,含有众多科学工具包,直接安装anaconda免除了许多包的手动安装,点击这里下载. 按照你的实际情况选择下载.下载完 ...

StringBuilder的构造方法和append方法

Java中StringBuilder的构造方法 StringBuilder构造方法: public StringBuilder(): 创建一个空白可变的字符串对象,不含有任何内容 public Str ...

01-vscode自定义配色方案 插件基础上

01-下载相关主题插件 02- 点击设置按钮 复制id 03-进入插件文件 C:\Users\Administrator\.vscode\extensions 04-复制刚才的id 05-themes ...

彻底理解DDS(信号发生器)的fpga实现(verilog设计代码)

DDS(Direct Digital Synthesis)是一种把一系列数字信号通过D/A转换器转换成模拟信号的数字合成技术. 它有查表法和计算法两种基本合成方法.在这里主要记录DDS查表法的fpga ...

金瓯无缺江河一统|Win10系统基于Docker和Python3搭建并维护统一认证系统OpenLdap

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_180 OpenLdap(Lightweight Directory Access Protocol)是什么?它其实是一个开源的.具 ...

Apache DolphinScheduler 3.0.0 正式版发布!

​ 点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler ​ 版本发布 2022/8/10 2022 年 8 ...