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

时间:2011-01-07 16:30:16

标签: wix windows-installer sandcastle

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

我正在使用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: Eric@EWoodruff.us
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,它表示操作成功完成当我检查帮助库时,我的帮助库未安装。

但是,如果我删除了/silent开关,则会弹出常用的“帮助库管理器”窗口,并列出我的帮助库。

显然,我希望能够从WiX自动安装我的帮助文件,而无需与帮助库管理器的GUI交互,但我必须遗漏一些东西。是否无法通过命令提示符或通过WiX静默安装帮助文件? (通过命令提示符静默卸载可以正常工作)。

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

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"

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

编辑:

这是我用于静默帮助安装的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位操作系统之间的路径不同。