我正在尝试将自己的帮助文件添加到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=""HelpLibraryManagerLauncher.exe" /product "VS" /version "100" /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。
非常感谢任何帮助。
答案 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位操作系统之间的路径不同。