尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

NanaZip MSIX 打包原理深度解析:Desktop Bridge、文件系统虚拟化与资源管理器右键菜单集成全揭秘

NanaZip MSIX 打包原理深度解析:Desktop Bridge、文件系统虚拟化与资源管理器右键菜单集成全揭秘 NanaZip MSIX 打包原理深度解析Desktop Bridge、文件系统虚拟化与资源管理器右键菜单集成全揭秘【免费下载链接】NanaZipThe 7-Zip derivative intended for the modern Windows experience项目地址: https://gitcode.com/JRJSheep/NanaZipNanaZip 是一款基于 7-Zip 内核、面向现代 Windows 体验的开源压缩管理器它采用 MSIX 包格式分发通过 Desktop Bridge完全信任桌面桥接技术让经典桌面程序获得现代化部署的全部好处。本文将用通俗的语言拆解三大核心问题MSIX 包是怎么打出来的、文件系统虚拟化为什么会影响 AppData 目录、以及资源管理器右键菜单是如何注入的。无论你是普通用户还是想了解打包原理的新手读完后都能看懂 NanaZip 的现代化架构。一、什么是 MSIX为什么 NanaZip 选择它MSIX又称 Appx 包是微软官方的现代应用打包格式可以把它理解为压缩文件 一份说明书清单文件声明式安装Windows 读取清单后自动完成注册包括开始菜单、文件关联、图标、右键菜单等无需手写注册表可原子化更新与卸载升级和回滚由系统统一管理签名与校验包内容经过哈希校验防止安装后被篡改。NanaZip 的主入口清单是 Package.appxmanifest打包工程则是 NanaZipPackage.wapproj。清单中的两行关键配置揭示了 NanaZip 的技术路线配置值含义EntryPointWindows.FullTrustApplication以完全信任模式运行桌面程序即 Desktop Bridge 路线rescap:CapabilityrunFullTrust申请完全信任能力可读写任意磁盘路径 为什么压缩软件必须是完全信任因为 7-Zip 需要读写用户选定的任意目录而 UWP 沙箱默认只允许访问有限的允许位置。runFullTrust正是为此设计的。二、打包全流程从代码到 .appxbundleNanaZip 的构建入口是根目录的 BuildAllTargets.proj它串联了四个阶段RefreshVersion刷新版本号从 Git 提交时间推算出形如主.次.天数.0的版本号并通过 RefreshAppxManifestVersion.cs 自动回写进Package.appxmanifest的Identity/Version属性——这就是为什么 MSIX 版本号永远比人读的版本号多出一位Restore还原依赖按 Debug/Release × x64 还原整个解决方案Build编译打包调用NanaZipPackage.wapproj构建。wapproj 中声明AppxBundlePlatforms为x64|arm64即同时为 x64 和 ARM64 平台生成切片最终产出一个.appxbundle智能包系统会自动挑选匹配的架构安装Packaging产物整理把K7Base.dll、NanaZip.Core.dll、NanaZip.Modern.dll、自解压外壳.sfx等二进制连同符号文件按架构归档方便发布。清单还启用了两项现代特性uap10:PackageIntegrity uap10:Content Enforcementon / /uap10:PackageIntegrity uap16:UpdateWhileInUsedefer/uap16:UpdateWhileInUse前者是包完整性校验配合安全加固防止包内容被替换后者允许应用运行中延迟更新——这也是安装命令行里带-DeferRegistrationWhenPackagesAreInUse参数的原因。三、Desktop Bridge 与文件系统虚拟化看不见的透明层Desktop Bridge 让经典桌面程序跑在 MSIX 之上代价是 Windows 会给程序套一层文件系统虚拟化对包目录的写操作会被静默重定向到用户沙箱防止桌面程序污染受保护位置。NanaZip 在清单中显式配置了重定向例外见 Package.appxmanifest 的virtualization:FileSystemWriteVirtualization节点例外目录说明LocalAppData每个用户独立的本地数据目录LocalAppDataLow低完整性进程数据目录RoamingAppData可在多设备间漫游的数据目录这些配置解释了 ReadMe.md 已知问题一节的现象安全模式下无法使用 NanaZipDesktop Bridge 的虚拟化依赖完整桌面环境安全模式缺少相应服务⚠️Windows 10 下 AppData 写入会被重定向微软商店策略不允许应用彻底关闭虚拟化只有上述三个目录被排除其他位置尤其是 Win11 中AppData下非 Local/Roaming 的目录的写操作仍会被重定向到包沙箱官方也明确提醒不要手动解包 MSIX 当便携版长期用那是调试用途右键菜单和文件关联都不生效。除清单声明的虚拟化外NanaZip 还自带一层API 重定向库K7Base/K7BaseRedirector.cpp 在链接期把FileTimeToLocalFileTime等老 API 直接替换为自实现版本K7_REDIRECT宏K7User/K7UserRedirector.cpp 负责用户态 API。这个平台抽象层K7Base/K7User让压缩内核在不同系统基线上行为一致细节可阅读 K7Base/ReadMe.md。四、右键菜单集成全揭秘一个 DLL 的旅程在资源管理器中选中文件右键能看到NanaZip菜单靠的是清单里的三个扩展协作完成4.1 注册入口fileExplorerContextMenusdesktop4:Extension Categorywindows.fileExplorerContextMenus desktop4:FileExplorerContextMenus desktop4:ItemType Type* desktop4:Verb Id0000NanaZipShellExtension Clsid469D94E9-6AF4-4395-B396-99B1308F8CE5 / /desktop4:ItemType desktop5:ItemType TypeDirectory ... /desktop5:ItemType desktop10:ItemType TypeDrive ... /desktop10:ItemType /desktop4:FileExplorerContextMenus /desktop4:Extension三种ItemType分别对应文件、文件夹、磁盘驱动器因此选中任意对象都会出现菜单⚠️ Verb 的 Id 故意以0000数字前缀开头是为了在 Windows 10 经典右键菜单中靠排序技巧抢到靠前位置源码注释说明了这一 workaround磁盘驱动器的菜单受系统限制仅 Windows 11 22H2 及以上显示。4.2 进程外 COM 服务器comServer扩展com:Extension Categorywindows.comServer com:ComServer com:SurrogateServer DisplayNameNanaZip Shell Extension com:Class Id469D94E9-... PathNanaZip.ShellExtension.dll ThreadingModelSTA / /com:SurrogateServer /com:ComServer /com:Extension关键点SurrogateServer意味着 COM 类运行在包自己的独立进程中而不是宿主在 Explorer 进程里加载 DLL。这既避免了插件崩溃拖垮资源管理器又符合商店包隔离规则。4.3 菜单逻辑IExplorerCommand 实现菜单内容真正由 NanaZip.UI.Modern/NanaZip.ShellExtension.cpp 实现。它实现IExplorerCommand接口按根命令 子命令两级组织根命令ExplorerCommandRoot负责枚举子命令图标取自主程序-1号图标子命令覆盖打开、测试压缩包、解压到、解压到当前文件夹、智能解压、添加到 7z/zip 压缩包、邮件压缩、CRC32/CRC64/SHA-1/SHA-256 哈希计算等解压前会用扩展名黑名单图片、视频、文本等判断是否需要解压并自动生成压缩包名\子文件夹分卷.part001/.001也能正确识别菜单文案走多语言资源LangString支持整套界面语言。五、文件关联与执行别名老用户无缝迁移除了右键菜单清单还声明了两类存在感很强的扩展文件类型关联windows.fileTypeAssociation注册了.7z、.zip、.rar、.zst、.lz4等 60 余种扩展名双击压缩包即唤起 NanaZipAssets\ArchiveFile.png提供了压缩包文件图标见 Assets/PackageAssets/ 目录包含全部 108~1024px 的图标规格执行别名appExecutionAlias这是迁移神器——别名指向作用7z.exe/NanaZipC.exe/K7C.exeNanaZip.Universal.Console.exe命令行工具7zG.exe/NanaZipG.exeNanaZip.Universal.Windows.exe图形模式 7-Zip 兼容7zFM.exe/NanaZip.exeNanaZip.Modern.FileManager.exe新版主界面7zFM.exe和7z.exe带AllowOverridetrue不会抢占其他压缩软件的 7-Zip 别名而NanaZip.exe是独占的。这样依赖7z.exe的脚本几乎可以零改动迁移。六、双通道发布与版本管理NanaZip 在微软商店分Release稳定与Preview预览两条通道两者的差异被固化在 Documents/ChannelSwitchNote.md 中包标识名不同40174MouriNaruto.NanaZipvs40174MouriNaruto.NanaZipPreview清单Identity/Name中的 GUID 前缀是作者的开发者账号前缀右键菜单名称不同NanaZipvsNanaZip Preview即NanaZip.ShellExtension.cpp中GetTitle返回的字符串菜单 Clsid 也不同避免两版共存时菜单互相干扰。版本号由构建系统自动计算BuildAllTargets.proj中距项目创建日的天数保证了商店更新检查能感知每一个构建。七、安装与验证一条命令看懂 MSIX 部署对于拿不到微软商店的机器NanaZip 提供带 XML 许可证的 MSIX 包为所有用户部署只需一条管理员命令Add-AppxProvisionedPackage -Online -PackagePath .\NanaZip.msix -LicensePath .\NanaZip.xml为当前用户安装则用Add-AppxPackage -DeferRegistrationWhenPackagesAreInUse -ForceUpdateFromAnyVersion -Path .\NanaZip.msix⚠️ 注意离线安装后必须联网启动一次应用Windows 才能向授权服务器完成许可证激活否则可能无法启动。安装后可在设置 → 应用中查看右键菜单若未立即出现重启一次资源管理器进程即可。小结NanaZip 的 MSIX 打包实践是一次教科书式的经典桌面应用现代化用runFullTrust Desktop Bridge 换取任意路径读写能力用FileSystemWriteVirtualization例外列表把配置数据留在真实 AppData用fileExplorerContextMenus 进程外 COM 实现安全、隔离的右键菜单用执行别名平滑接管 7-Zip 生态位用版本自动化 双通道清单维护支撑商店级发布节奏。理解了这套机制你就能看懂绝大多数现代化改造的压缩工具是怎么在 Windows 上同时做到既开放、又受控的。【免费下载链接】NanaZipThe 7-Zip derivative intended for the modern Windows experience项目地址: https://gitcode.com/JRJSheep/NanaZip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表