使用帮助库管理器和 WiX 安装帮助

2024-04-25

我试图通过使用 WiX 运行 Sandcastle 帮助文件生成器在构建我的 Sandcastle 项目后创建的 HelpLibraryManagerLauncher,将我自己的帮助文件添加到 Visual Studio 2010 的帮助库中。

我正在使用 WiX 的 QuietExec 自定义操作来运行以下命令:

HelpLibraryManagerLauncher.exe
  /product "VS"
  /version "100"
  /locale en-us 
  /silent 
  /brandingPackage Dev10.mshc 
  /sourceMedia MyClassLibraryHelp.msha

但是,MSI 安装程序失败并显示以下信息:

Action 00:00:00: InstallVS2010Help.
CAQuietExec:  Help Library Manager Launcher, version 1.0.0.0
CAQuietExec:  Copyright c 2010, Eric Woodruff, All Rights Reserved
CAQuietExec:  E-Mail: [email protected] /cdn-cgi/l/email-protection
CAQuietExec:  
CAQuietExec:  Running Help Library Manager to perform the requested action.  Please wait...
CAQuietExec:  
CAQuietExec:  ERROR: The requested operation could not be performed.
CAQuietExec:  Details: The Help Library Manager returned the exit code 401: The installation of content failed.  Detailed information can be found in the event log and in the installation log.
CAQuietExec:  Error 0x80070191: Command line returned an error.
CAQuietExec:  Error 0x80070191: CAQuietExec Failed
CustomAction InstallVS2010Help returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)

检查EventLog,记录以下错误:

An error occurred while updating local content: Microsoft.Help.CacheLib.CacheLibUnsignedInstallRefusedException: Exception of type 'Microsoft.Help.CacheLib.CacheLibUnsignedInstallRefusedException' was thrown.
 at Microsoft.Help.CacheLib.DocumentationCache.VerifyAndExtractPackages(VendorName vendorName, ChangeDescription change, StatusCallback`1 statusCallback, CertificateCheckCallback certCheckCallback)
 at Microsoft.Help.CacheLib.DocumentationCache.IntegrateChange(VendorName vendorName, ChangeDescription change, StatusCallback`1 statusCallback, CertificateCheckCallback certCheckCallback)
 at Microsoft.Help.CacheLib.DocumentationCache.Update(VendorName vendorName, Boolean checkForOnlineUpdates, StatusCallback`1 statusCallback, CertificateCheckCallback certCheckCallback)
 at Microsoft.Help.CacheLib.CacheManager.<>c__DisplayClass24.<UpdateAsync>b__23()
 at Microsoft.Help.CacheLib.AsyncOperationRunner.Run(Object state)

这是我的 WiX 代码:

<CustomAction Id="InstallVS2010Help" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" />
<CustomAction Id="SetPropertiesForInstallVS2010Help"
              Property="InstallVS2010Help"
              Value="&quot;HelpLibraryManagerLauncher.exe&quot; /product &quot;VS&quot; /version &quot;100&quot; /locale en-us /silent /brandingPackage Dev10.mshc /sourceMedia MyClassLibraryHelp.msha"
              Execute="immediate" />
.
.
.
<InstallExecuteSequence>
  <Custom Action="SetPropertiesForInstallVS2010Help" Before="InstallInitialize">NOT INSTALLED</Custom>
  <Custom Action="InstallVS2010Help" Before="InstallFinalize">(NOT INSTALLED) AND (NOT UPGRADINGPRODUCTCODE) AND (NOT REMOVE="ALL")</Custom>
<InstallExecuteSequence>

如果我运行HelpLibraryManagerLauncher从命令提示符处,它表示操作已成功完成but当我检查帮助库时,我的帮助库未安装。

如果我删除/silent但是,切换后,通常会弹出“帮助库管理器”窗口,并列出我的帮助库。

显然,我希望能够从 WiX 自动安装帮助文件,而无需与帮助库管理器的 GUI 交互,但我一定错过了一些东西。是否无法通过命令提示符或 WiX 静默安装帮助文件? (不过,通过命令提示符静默卸载效果很好)。

The CacheLibUnsignedInstallRefusedException也是一个问题。即使帮助文件未签名,如何让 WiX(和我的 MSI)安装它?

我使用的是 WiX v3.5.2415、Sandcastle v2.610621.1 和 Sandcastle Help File Builder v1.9.1.0。 Sandcastle 帮助文件生成器使用的 Help 2.0 编译器和 HTML Help Workshop hhc 可执行文件来自 Visual Studio 2008 SDK。

任何帮助将不胜感激。


HelpLibManager.exe 允许静默安装帮助集合。但是,要求之一是帮助集合必须包含在签名的 cab 文件中。这意味着您无法使用 .mshc 文件进行静默安装。

您需要做的第一件事是获取代码签名证书。如果您还没有,您可以从 VeriSign 购买一份。

拥有代码签名证书后,您需要将 mshc 文件转换为 cab 文件。您可以在命令行上使用 makecab 命令来实现此目的。

makecab myhelp.mshc myhelp.cab

然后,您需要使用代码签名证书对 cab 文件进行数字签名。您可以通过在命令行上使用signtool 命令来实现此目的。

signtool sign /f your-purchased-signing-certificate.pfx /p password /d "My Help Collection" myhelp.cab

.cab 文件经过签名后,即可在静默帮助安装中使用它来代替 .mshc 文件。请务必更新您的 msha 文件以指向 .cab 文件而不是 .mshc 文件。

/brandingPackage 开关不是必需的。我还建议将 /content 开关添加到您的自定义操作中

/content "[CommonAppDataFolder]Microsoft\HelpLibrary"

因为如果用户尚未为本地帮助集合设置默认存储,静默帮助安装将会失败。如果用户已经设置了默认商店,则此开关将被忽略,因此始终使用它没有什么坏处。

Edit:

这是我用于静默帮助安装的 wix 代码。请注意,我使用的是所有文件的完整路径。

首先,设置一个包含 HelpLibManager 路径的属性。

<SetProperty Id="HELPLIBMANAGER"
             Value="[ProgramFilesFolder]Microsoft Help Viewer\v1.0\HelpLibManager.exe"
             After="InstallInitialize"/>

接下来,声明将使用我们刚刚设置的 HELPLIBMANAGER 属性的自定义操作。请注意 ExeCommand 中使用单引号 ('),以便我们可以使用双引号 (") 括住文件路径。

<CustomAction Id="InstallHelp"
              Directory="YourHelpDir"
              ExeCommand='"[HELPLIBMANAGER]" /product VS /version 100 /locale en-us /silent /content "[CommonAppDataFolder]Microsoft\HelpLibrary" /sourceMedia "[#filekey.msha]"'
              Execute="deferred"/>
<CustomAction Id="RollbackInstallHelp"
              Directory="YourHelpDir"
              ExeCommand='"[HELPLIBMANAGER]" /product VS /version 100 /locale en-us /silent /uninstall /vendor "YourVendorName" /productName "YourProductName" /mediaBookList "YourMediaBookList"'
              Execute="rollback"/>

最后,安排自定义操作:

<Custom Action="RollbackInstallHelp" After="InstallFiles">NOT REMOVE="ALL"</Custom>
<Custom Action="InstallHelp" After="RollbackInstallHelp>NOT REMOVE="ALL"</Custom>

卸载操作几乎相同,应该很容易弄清楚。另请注意,这仅适用于 32 位操作系统。如果您还想支持 64 位操作系统,那么您将需要更多自定义操作来设置 HelpLibManager 的正确路径,因为 32 位操作系统和 64 位操作系统之间的路径不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用帮助库管理器和 WiX 安装帮助 的相关文章

  • 在 Wix 安装程序中以管理员模式运行 customAction 中的 ExeCommand

    我是 wix 安装程序的新手 我已经为我的应用程序使用 wix 安装程序开发了一个设置 我需要执行自定义操作来运行 cmd exe 中的命令 XP 下运行正常 但在 Windows 8 和 7 中 cmd 提示符需要以管理员身份运行 我用谷
  • 对于 msiexec,这些定向到安装程序的不同方法有什么区别?

    我有一个简单的问题 我只找到了两种实际运行我的 msi 文件的方法 但它们都不起作用 密切关注我的使用情况 and 简而言之 我想要一种方法来做到这一点 Basics PSScriptRoot Start Process msiexec e
  • 使用 WiX 进行重大升级后无法启动 Windows 服务

    我有一个非常简单的 WiX 项目 没有什么花哨 当尝试对现有安装执行 MajorUpgrade 时 无法启动服务 并且不可避免地会回滚到以前的版本并正常启动服务 我已经删除了Start install 并成功手动启动应用程序 所以我知道这不
  • 使用自定义操作卸载多个产品

    我正在为我们的产品开发基于 WIX 的安装程序 该产品有一个基础产品和许多插件 基础版和插件将作为单独的 MSI 提供 仅当底座可用时才能安装插件 基础和插件在根文件夹下共享公共文件夹树 例如 C Program files MyProdu
  • Wix如何隐藏功能选项

    我正在使用 Wix 3 5 构建 MSI 安装程序 我想知道是否有任何方法可以隐藏 功能自定义安装对话框 中的某些选项 您可以在其中从功能树中选择要安装的内容 我只想有 将安装在本地硬盘上 和 整个功能将不可用 的选项 目前 除了这两个选项
  • 如何检测正在运行的 MSI 安装 [重复]

    这个问题在这里已经有答案了 我正在寻找一种方法来检测 Windows Installer 安装是否已在进行中 到目前为止我发现的是 检查注册表项 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows C
  • 成功后动态改变EndDialog中的RTF内容

    多亏了这个question https stackoverflow com a 33679439 1076116 我能够执行自定义操作来临时更新和动态修改 MSI 数据库 简而言之 我正在做 CustomAction public stat
  • 如何确定现有应用程序的安装范围?

    我有一个基于的安装程序WixUI Advanced允许用户选择安装范围 每个用户或机器范围 升级时 安装了较低版本的现有应用程序 我想隐藏安装范围屏幕并自动选择他们上次选择的安装范围 如何判断先前安装使用的安装范围 Edit 查看我的 MS
  • WiX 在构建服务器上失败

    我有一个使用 WiX 的项目 它在我的本地计算机上运行良好 但是当我发布到构建服务器时 构建会因以下内容而崩溃 来自 MSBuild 日志 Using HeatDirectory task from assembly C Program F
  • “应用变换时出错。验证指定的变换路径是否有效”的根本原因是什么?

    我有 MSI 安装程序 我正在使用 PowerShell 脚本安装和卸载它 当我卸载它时 我在 Azure 上创建的 Windows 2008 2016 服务器上收到以下错误 应用变换时出错 验证指定的转换路径是否有效 如果我使用非 Azu
  • 当自动为 WIX 安装程序收集文件时,我的目录结构有多灵活?

    请原谅我的无知 我一直在阅读一些书 但还没有准备好尝试任何东西 目前 我们有一个 wxs 文件 该文件无法轻松维护 每当从 SVN 提交 删除新文件时 都会手动添加 删除所有文件 由于在创建新文件和更新 wxs 安装文件之间发生了失误 我们
  • 使用 Visual Studio 安装项目设置 InstallPath 注册表项

    我正在使用使用 Visual Studio 安装项目设计的 msi 安装程序来部署我的应用程序 如何将注册表项设置为应用程序的安装路径 实际上 当我在寻找同样的东西时 还提到了以下解决方案 在注册表项中使用 TARGETDIR
  • 如何使用自定义操作在 WiX 中运行脚本 - 最简单的示例?

    WiX新手问题 我该怎么办1 将一次性 shell 脚本与安装程序一起复制到 temp e g
  • WIX 合并 C++ 运行时

    我已经合并了 msm 与 2015 crt
  • WIX MSI 软件包卸载

    我正在使用 WIX 作为安装程序包 当我通过双击原始 msi 包卸载该包时 一切都很好 当我从控制面板卸载时 它会给我一个最小的用户界面卸载 我已在 MSI 中写入一个自定义操作 询问用户是否要卸载某些数据库等 最小 UI 卸载时不会发生这
  • WiX - 根据环境将编译后的 web.config 复制到网站根目录

    作为 WiX 安装的一部分 我将所有转换 编译的 web config 文件复制到安装目录 编译后的 web config 的名称格式为 web ENV config 在我的安装 UI 中 我创建了一个自定义对话框 在其中解析 ENV 并填
  • Microsoft Visual Studio 安装程序项目 - 如何向使用 Process.Start() 执行但没有修复选项的 MSI 提供重新启动提示

    问题如下 我在 MSI 卸载之前调用了自定义卸载程序 正确关闭我的应用程序后 它会调用msiexec使用 Windows Installer 卸载 MSI 这是通过执行 msiexec x PRODUCT CODE promptrestar
  • 如何在 WIX 中引用用户的主目录

    我正在为 SDK 创建一个安装程序 其中包括由最终用户编译的源代码 我希望我的 Wix 安装程序默认将其放入用户的主目录中 但我找不到要使用的正确属性名称 您还可以参考HOMEPATH环境变量与 HOMEPATH 有关用于属性的语法的更多详
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • 将构建参数传递给 .wxs 文件以动态构建 wix 安装程序

    我是一名学生开发人员 我已经为我现在工作的公司构建了几个安装程序 所以我对WIX还是比较熟悉的 我们最近决定拥有一个构建服务器来自动构建我们的解决方案 它构建调试和发布以及混淆 和非混淆 项目 你真的不需要理解这些 您需要了解的是 我有相同

随机推荐

  • 如何更改 Github/Markdown 中图像的大小?

    我正在 Github 存储库中编辑 Readme md 文件 并插入了一张图片 请参阅https github com khpeek FMCW 雷达 https github com khpeek FMCW radar 图片占据了整个宽度
  • 有点好奇了解 .NET 中的表达式树

    我读过几篇文章和几篇stackoverflow com关于表达式树的帖子 我的大脑很难理解 问题 1 像DOM 文档对象模型 一样 它是逻辑的内存表示 2 有人解释说它是一种将可执行 代码转换为数据的机制 使用它我们可以生成表示代码的数据结
  • Theano 中的名称冲突

    我正在尝试在模块中导入 theano 但我得到了回溯 File media tarun 6A86CA8286CA4DEF develop pydy pydy codegen code py line 16 in
  • SearchManager - 添加自定义建议

    我已经阅读了有关构建搜索界面和添加自定义建议的所有在线文档 但我仍然不清楚这是如何工作的 文档说我必须 为您的建议构建一个表 例如在 SQLiteDatabase 中 并使用所需的列格式化表 我假设系统最终会自己用适当的建议填充此表 但是哪
  • gitk:悬停时显示分支名称

    你能告诉我如何让 gitk 工具在悬停时显示分支名称或建议能够这样做的工具吗 gitk 显示分支缠结 其中分支是无名的 我必须猜测哪个是 master 哪个是 stable 等 在 gitk 窗口的左下半部分 有一个信息行指定Branche
  • Docker 上的 MySQL?

    我是 Docker 新手 仍在探索中 我遇到了这个问题 可能看起来很愚蠢 但我真的被困住了 所以我有一个使用 MySQL 服务器的 Spring boot 应用程序 我想在容器上运行我的应用程序 我设法 运行一个没有 MySQL 的应用程序
  • 在 model.fit() 期间记录 Keras 中每个时期的计算时间

    我想比较不同模型之间的计算时间 在拟合期间 每个时期的计算时间被打印到控制台 Epoch 5 5 160000 160000 10s 我正在寻找一种方法来存储这些时间 其方式与模型指标类似 模型指标保存在每个时期并可通过历史对象获取 尝试以
  • 通过 DynamicMethod 调用 varargs 方法

    我正在尝试使用 DynamicMethod 调用非托管的类似 printf 的函数 在运行时我得到一个 BadImageFormatException 找不到索引 HRESULT 的异常 0x80131124 这是运行时的限制还是我发出的代
  • 如何使用 se.py 在 gem5 系统调用模拟模式下编译和运行可执行文件?

    有许多可能的错误和解决方法分散在不同的地方 任何人都可以提供至少一种详细的工作设置 以及确切的 gem5 和编译器版本 希望在 Ubuntu 上吗 最小的 Ubuntu 设置 首先要注意一件事 动态链接的可执行文件首先运行动态加载器 这意味
  • 如何仅为具有特定模板 ID 的列表添加事件接收器

    我正在为自定义列表模板添加 ItemAdding 事件接收器 事件接收器和列表模板都是由相同的功能部署的 同样的功能还可以创建列表实例 我遇到的问题是该事件是为每个列表项触发在其部署的地点 eventreceivre 的 Elements
  • 使用 C# 驱动程序从 MongoDB 集合上的文本查询中检索相关性有序结果

    我正在尝试对集合进行文本查询并按文本匹配顺序检索结果 The docs http docs mongodb org manual reference operator query text text search with addition
  • SMARTGWT 数据源 (GWT-RPC-DATASource) LISTGRID

    我在使用 smartGWT 绑定 ListGrid 中的数据源时遇到问题 我有 GWT RPC DataSource 并将其设置为我的数据源 grid setDataSource ds 单击一键 我的数据源发生了一些更改 我正在生成新的数据
  • C# 内存地址扩展与代码

    我得到了以下 MemoryAddressExtensions 代码 它显示了 C 中的对象地址 想知道什么是 IntPtr and IntPtr Thanks public static class MemoryAddressExtenst
  • 使用 ViewPager、PagerAdapter 和 AsyncTask 的活动会导致空白视图

    我正在尝试构建一个充当日历日视图的活动 当用户向左或向右滑动时 他们将通过日历转到明天或昨天等 我决定使用 ViewPager PagerAdapter 来处理视图并控制几天的分页 作为设置日视图的一部分 应用程序将访问我的 API 并请求
  • 是什么阻止了 fsockopen?

    经过半天的努力 我终于通过转换这个函数来让reCAPTCHA工作 function recaptcha http post host path data port 80 req recaptcha qsencode data http re
  • 错误:查询没有结果数据的目标

    CREATE OR REPLACE FUNCTION chkLogin userid varchar pwd varchar RETURNS BOOLEAN AS BODY DECLARE passed BOOLEAN BEGIN SELE
  • Pandas 更改外汇 DataFrame 的时区

    我们如何更改 Pandas DataFrame 中的时区 我编写了一些简单的代码来读取 1 分钟 EURUSD 数据 日期时间 开盘价 最高价 最低价 收盘价 成交量 示例数据采用 EST 时区 我需要将其转换为 UTC df tz con
  • ImageMagick 在命令行中工作,但是当 php 中的 exec() 时,它返回 5 并显示“不兼容的库版本”

    我在 OS X 上使用 MAMP 以及 Macports 的 php 5 3 6 和 ImageMagick 命令行 遇到了一个奇怪的问题 当我从 CLI 运行识别命令时 它工作正常 但是当我使用运行完全相同的命令时exec 它返回一个值代
  • Invoke-WebRequest 设置超时

    我有一个长时间运行的网页 需要 Powershell 来调用 我每晚从任务管理器运行它 内容如下 powershell Command Invoke WebRequest https www example com longrunningt
  • 使用帮助库管理器和 WiX 安装帮助

    我试图通过使用 WiX 运行 Sandcastle 帮助文件生成器在构建我的 Sandcastle 项目后创建的 HelpLibraryManagerLauncher 将我自己的帮助文件添加到 Visual Studio 2010 的帮助库