【问题标题】:Installing Help with Help Library Manager and WiX使用帮助库管理器和 WiX 安装帮助
【发布时间】:2011-01-07 16:30:15
【问题描述】:

我正在尝试将我自己的帮助文件添加到 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 Help File Builder v1.9.1.0。 Sandcastle Help File Builder 使用的 Help 2.0 Compiler 和 HTML Help Workshop hhc 可执行文件来自 Visual Studio 2008 SDK。

任何帮助将不胜感激。

【问题讨论】:

    标签: wix windows-installer sandcastle


    【解决方案1】:

    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 位操作系统之间是不同的。

    【讨论】:

    • 感谢您的准确回答。我已按照您的步骤进行操作,但现在当我尝试使用 HelpLibraryManagerLauncher 直接安装帮助时,将收到“System.UriFormatException:无效的 URI:无法确定 URI 的格式”错误写入事件日志。如果我在没有 /silent 选项的情况下运行它,则会出现 GUI,并且安装会正常进行。对差异有任何想法吗?
    • 我从来没有遇到过因 UriFormatException 导致的静默安装失败,所以这都是猜测。因为您遇到了 Uri 异常,所以我的假设是 HelpLibMangaer 认为您正在安装 Web 内容而不是磁盘内容。我的建议是包含 HelpLibManager 命令中使用的所有文件的完整路径。我将编辑我的答案以包含我用来运行命令的 wix 代码。
    • 是的,就是这样:我需要提供 .msha 文件的完整引用路径。感谢您的所有帮助和洞察道格拉斯。
    猜你喜欢
    • 2010-12-15
    • 2011-07-28
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多