关于指定特定Windows版本TFM后输出包含大体积SDK相关程序集的疑问
关于指定特定Windows版本TFM后输出包含大体积SDK相关程序集的疑问
嗨,我来给你拆解一下这个问题,正好对这块挺熟悉的:
首先说那两个让你头疼的dll是干嘛的:
- Microsoft.Windows.SDK.NET.dll:这其实是.NET专门为Windows 10 2004(也就是19041版本)的WinRT API做的托管包装集合。Win10之后微软推出了很多新的WinRT风格API(比如和系统设置、多媒体、UWP相关的新接口),这个dll把这些原生的WinRT API转换成.NET代码能直接调用的类和方法,省得你自己写复杂的互操作代码。因为它打包了对应版本Windows SDK里几乎所有WinRT API的包装,所以体积才会飙到25MB。
- WinRT.Runtime.dll:这个是个核心小工具库,负责处理.NET和WinRT环境之间的“翻译”工作——比如把.NET的异步Task转换成WinRT的IAsyncOperation,或者处理两种环境下的类型转换、对象生命周期管理,只要你用到WinRT API,这个库就是必须的底层支持。
至于为什么用net8.0-windows就不会有这两个文件?因为这个TFM对应的最低兼容系统是Windows 7,而Win7本身根本不支持WinRT API,所以.NET默认不会给你打包这些WinRT相关的库,你的项目也只能调用那些兼容Win7的传统.NET API,自然就没了这两个大体积文件。
接下来是你最关心的:怎么避免它们?分两种情况说:
- 如果你根本不需要用Win10及以上的WinRT新API:那最简单,继续用
net8.0-windows这个TFM就行,既能保持你的小应用体积,还能兼容从Win7到Win11的所有系统。 - 如果你确实需要调用Win10+的特定API,但又不想让体积膨胀:
- 开启发布剪裁:在你的项目文件(.csproj)里加上一行
<PublishTrimmed>true</PublishTrimmed>,然后用dotnet publish <project> --runtime win-x64 --no-self-contained -c Release命令发布。剪裁功能会自动把你项目里完全没用到的API从那两个dll里删掉,原本25MB的文件可能会缩水到几MB甚至更小,具体大小看你实际用到的API数量。 - 检查依赖项:看看你的项目或者引用的NuGet包是不是无意中引入了WinRT相关的依赖。如果某个第三方库带了不需要的WinRT引用,把它移除之后,这两个dll可能就不会被打包进来了。
- 确认是否真的需要特定版本TFM:如果你的应用只是需要兼容Win10及以上,不需要19041版本独有的API,其实可以换用更低版本的特定TFM(比如
net8.0-windows10.0.17763,对应Win10 1809),不过这个对体积影响不大,核心还是剪裁效果最明显。
- 开启发布剪裁:在你的项目文件(.csproj)里加上一行
内容来源于stack exchange
相关产品推荐
相关产品推荐

