把 Windows 安装包压到 36 KB
DisableWinShortcuts 的安装包只有 36 KB。经常有人问是怎么做到的,这里统一回答一下。
先看看别人有多大
我用常见的打包方式分别打了一遍,同一个程序:
| 方式 | 安装包大小 | 备注 |
|---|---|---|
| .NET 8 自包含单文件 | 68 MB | 带完整运行时 |
| .NET 8 框架依赖 + Inno Setup | 2.1 MB | 需要用户装运行时 |
| .NET Framework 4.8 + Inno Setup | 1.6 MB | Inno 本身就有 1.5 MB |
| .NET Framework 4.8 + 自写安装器 | 36 KB | 本文的做法 |
结论很明显:安装器本身才是大头。
自己写一个安装器
一个「安装器」需要做的事其实很少:
- 把主程序复制到
%LOCALAPPDATA%\Programs\DisableWinShortcuts\; - 在开始菜单创建快捷方式;
- 在「应用和功能」里注册卸载项;
- 可选:写入开机自启。
主程序以资源的形式嵌在安装器里,运行时释放出来:
using (var src = Assembly.GetExecutingAssembly()
.GetManifestResourceStream("payload.exe"))
using (var dst = File.Create(target))
{
src.CopyTo(dst);
}卸载项写在 HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall,同样不需要管理员权限。
编译选项
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<GenerateDocumentationFile>false</GenerateDocumentationFile>
</PropertyGroup>再配合几个小习惯:不用 WinForms 设计器,托盘菜单直接 P/Invoke;不引用任何 NuGet 包;图标只保留必要的尺寸。
代价
当然有代价:没有代码签名,体积又小,偶尔会被杀毒软件误报。我在工坊页面上给每个文件都附了 SHA-256,下载之后可以自己核对:
certutil -hashfile DisableWinShortcutsSetup.exe SHA256
36 KB 真的离谱,学习了。
自写安装器的卸载项那里,记得也要处理开机自启的残留。