Mosink墨溟

博客 开发手记

把 Windows 安装包压到 36 KB

DisableWinShortcuts 的安装包只有 36 KB。经常有人问是怎么做到的,这里统一回答一下。

先看看别人有多大

我用常见的打包方式分别打了一遍,同一个程序:

方式安装包大小备注
.NET 8 自包含单文件68 MB带完整运行时
.NET 8 框架依赖 + Inno Setup2.1 MB需要用户装运行时
.NET Framework 4.8 + Inno Setup1.6 MBInno 本身就有 1.5 MB
.NET Framework 4.8 + 自写安装器36 KB本文的做法

结论很明显:安装器本身才是大头。

自己写一个安装器

一个「安装器」需要做的事其实很少:

  1. 把主程序复制到 %LOCALAPPDATA%\Programs\DisableWinShortcuts\;
  2. 在开始菜单创建快捷方式;
  3. 在「应用和功能」里注册卸载项;
  4. 可选:写入开机自启。

主程序以资源的形式嵌在安装器里,运行时释放出来:

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

评论 · Comments2

  1. 周一舟

    36 KB 真的离谱,学习了。

  2. 青云

    自写安装器的卸载项那里,记得也要处理开机自启的残留。

写下评论

Ctrl + Enter 也可以发表