添加到 Mark Seemann 的回复中:
您还可以直接检查 MMC 注册表项,以验证您的管理单元是否已在 64 位注册表项或 32 位重定向注册表(显示在Wow6432Node下的注册表项)中注册:
- 64 位管理单元:HKLM\Software\Microsoft\MMC\SnapIns\FX:{SNAP-IN-GUID}...
- 32 位管理单元:HKLM\Software\Wow6432Node\Microsoft\MMC\SnapIns\FX:{SNAP-IN-GUID}...
如果您的条目仅在 HKLM\Software\Wow6432Node 下,那么您已经注册了 32 位管理单元,并且 Mark 关于运行“MMC /32”的建议应该使它们可见。这不是世界末日:如果您将 MMC 会话保存为管理单元快捷方式,我认为它在运行时会打开 32 位版本的 MMC。
如果您真的想要 64 位管理单元注册(为什么不呢?),MSDN 有一个关于 MMC 64 位与 32 位注意事项的页面,其中包含更多详细信息,包括调用哪些 InstallUtil 路径以获得 64 位和 32 位注册表项。
但请注意,某些 MSI 打包应用程序实际上在 MSI 本身中包含了 InstallUtil.exe 的副本作为二进制文件,而不是在目标计算机上调用该副本。(您可以通过查看 MSI 二进制表和使用Orca的自定义操作来检查是否发生这种情况。)如果仅包含 32 位 InstallUtil,它会将您的注册放在错误的位置 (Wow6432Node),这对您来说很不幸。
据我了解,Windows 安装程序“正确的方式”(TM)根本不使用 InstallUtil (我认为主要是由于运行托管 MSI 自定义操作所涉及的问题?)。在任何情况下,如果您避免使用 InstallUtil,您将通过在 MSI 中显式创建注册表项来完全注册您的管理单元,让 Windows Installer 控制创建和删除它们。
或者,您可以执行自定义操作来调用目标计算机的 Framework64 文件夹下的 InstallUtil.exe。这将获得正确的管理单元注册位置,但是您必须处理这样一个事实,即自定义操作会在运行时弹出一个 CMD shell 窗口,如果这让您感到困扰的话。不确定您的 MSI 创作工具是否具有同等功能,但在 WiX 中有Quiet Execution Custom Action。(我想如果你不使用 WiX,你仍然可以包含 WixUtilExtension.dll 并在适当设置 QtExec64CmdLine 属性后调用“CAQuietExec64”......但如果你在那个级别的 MSI 创作中工作,你可能会更好只是为了切换和使用 WiX :)