Skip to content

Instantly share code, notes, and snippets.

@luojunyuan
Last active March 5, 2026 03:19
Show Gist options
  • Select an option

  • Save luojunyuan/4efd1e363e324593379c40d8b695d916 to your computer and use it in GitHub Desktop.

Select an option

Save luojunyuan/4efd1e363e324593379c40d8b695d916 to your computer and use it in GitHub Desktop.
the minimal request csproj properties for creating an unpackage desktop winui app
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net9.0-windows10.0.26100.0</TargetFramework>
<UseWinUI>true</UseWinUI>
<Nullable>enable</Nullable>
<ImplicitUsings>true</ImplicitUsings>
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup>
<EnableMsixTooling>true</EnableMsixTooling>
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
<Platforms Condition="'$(WindowsAppSDKSelfContained)' == 'true'">x64;ARM64</Platforms>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" />
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.6.250205002" />
<PackageReference Condition="'$(PublishAot)' == 'true'" Include="Microsoft.Web.WebView2" Version="1.0.3065.39" />
</ItemGroup>
</Project>
@luojunyuan
Copy link
Copy Markdown
Author

luojunyuan commented Feb 19, 2025

  1. 引用新版本的 WebView2 是为了避免 AOT 编译时发出的警告
  2. EnableMsixTooling 是为了启用 dotnet cli 编译,让 .pri 文件正确复制 (这应该是一个bug)
  3. WindowsAppSDKSelfContained 设置为 false 会导致框架初始化设置同步上下文时 COMException: 没有注册类 0x80040154
  4. Platforms 是为了避免因 WindowsAppSDKSelfContained 引起的 VS 找不到架构的错误警告

Edit:
只有 publish 发布时,才会有 pri 不拷贝问题,build 都没问题 ,等于 EnableMsixTooling 作用于 publish 命令

@luojunyuan
Copy link
Copy Markdown
Author

要使用 dotnet cli build 需要指定架构如 -r win-x64

@luojunyuan
Copy link
Copy Markdown
Author

luojunyuan commented May 22, 2025

没有 launchSetting.json 的前提下 好像就需要 <WindowsPackageType>None</WindowsPackageType> 这个

Edit:

<WindowsPackageType>None</WindowsPackageType>

也是相当重要的一个东西,设置后,会在项目中链接导入俩文件,WinUI framework dependency 的必要条件,就不再需要 WindowsAppSDKSelfContained,不会再出现 COMException 未注册类,也不再需要强制指定 -r rid

@luojunyuan
Copy link
Copy Markdown
Author

luojunyuan commented Mar 4, 2026

!!! Warning !!! 重新说明
<WindowsPackageType> 重新再次被证实没任何意义作用
<EnableMsixTooling> 影响 dotnet 的 publish 指令拷贝 .pri 倒是 bug

<WindowsAppSDKSelfContained> 这三者的关系是

  1. <WindowsAppSDKSelfContained> 一旦开启,另外两者默认会链接导入的两个 cs 代码就会被清理
  2. <WindowsPackageType><EnableMsixTooling> 都可以用来导入 MddBootsrapAutoInitializer.cs WindowAppSDK-VersionInfo.cs 这俩启动必须的代码,有这俩才不会导致 COMException 未注册类。如果是 WASDK 自包含那就也不需要这俩者了。

现在的 WASDK 1.8 就是这样表现的,旧版本以前还真不太一样

@luojunyuan
Copy link
Copy Markdown
Author


能跑的最小的 winui 应用,默认 dotnet publish 就能生成
生成出来 总共 42 个项目,比起 debug 版(dotnet build 版 / VS 生成版),少了俩 xbf 文件
Aot 编译出来的。。总共就4个dll,也是有些完全多余的dll
(Microsoft.Windows.ApplicationModel.Background.UniversalBGTask)
(WebView)
只有 Microsoft.WindowsAppRuntime.Bootstrap 这个好像有用
增加 -r 指定 rid 完全等于把里面的三个 dll 提到目录顶层来了

结论 AnyCPU WinUI 没有任何问题,注意去掉任何 framework dependency

WindowsAppSDKSelfContained 就是会有一大串 Microsoft 开头的 dll winmd

我不太确定以下是不是 wasdk 最小依赖,有可能因为我电脑上自带 wasdk runtime 所以这一串能运行

CoreMessagingXP.dll 
dcompi.dll 
dwmcorei.dll 
marshal.dll 
Microsoft.DirectManipulation.dll 
Microsoft.InputStateManager.dll 
Microsoft.Internal.FrameworkUdk.dll 
Microsoft.UI.Composition.OSSupport.dll 
Microsoft.UI.Input.dll 
Microsoft.UI.Windowing.Core.dll 
Microsoft.UI.Windowing.dll 
Microsoft.UI.Xaml.Controls.dll 
Microsoft.ui.xaml.dll 
Microsoft.UI.Xaml.Phone.dll 
Microsoft.ui.xaml.resources.19h1.dll 
Microsoft.Windows.ApplicationModel.Resources.dll 
Microsoft.WindowsAppRuntime.dll 
Microsoft.WindowsAppRuntime.Insights.Resource.dll 
MRM.dll 
wuceffectsi.dll

感觉还是不太一样,直接拷贝应该是不行的。
不知道dotnetbootstrap 感觉不会自动帮忙安装 wasdk 依赖
还是启动的时候会提示安装,如果是这样,那么这条路还是能走通

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment