Установка справки с помощью Help Library Manager и WiX

Я пытаюсь добавить свой собственный файл справки в библиотеку справки Visual Studio 2010, используя WiX для запуска HelpLibraryManagerLauncher, который создает построитель файлов справки Sandcastle после сборки моего проекта Sandcastle.

Я использую пользовательское действие 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]
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, не взаимодействуя с графическим интерфейсом диспетчера библиотек справки, но я должен что-то упустить. Разве нельзя установить файл справки молча, либо через командную строку, либо через WiX? (Тем не менее, тихое удаление через командную строку работает нормально).

CacheLibUnsignedInstallRefusedException тоже вызывает беспокойство. Как мне заставить WiX (и мой MSI) установить мой файл справки, даже если он не подписан?

Я использую WiX v3.5.2415, Sandcastle v2.610621.1 и Sandcastle Help File Builder v1.9.1.0. Компилятор справки 2.0 и исполняемый файл HTML Help Workshop hhc, которые использует Sandcastle Help File Builder, взяты из Visual Studio 2008 SDK.

Любая помощь будет принята с благодарностью.


person Sameer Singh    schedule 07.01.2011    source источник


Ответы (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-разрядными ОС.

person Douglas Mendizábal    schedule 12.01.2011
comment
Спасибо за точный ответ. Я выполнил ваши шаги, но теперь я получаю сообщение об ошибке System.UriFormatException: Invalid URI: формат URI не может быть определен. Ошибка записывается в EventLog, когда я пытаюсь установить справку напрямую с помощью HelpLibraryManagerLauncher. Если я запускаю его без параметра /silent, появляется графический интерфейс, и установка проходит нормально. Любая идея для несоответствия? - person Sameer Singh; 12.01.2011
comment
У меня никогда не было сбоя автоматической установки с UriFormatException, так что это все предположения. Поскольку вы получаете исключение Uri, я предполагаю, что HelpLibMangaer считает, что вы устанавливаете веб-контент вместо содержимого диска. Мое предложение состояло бы в том, чтобы включить полный путь ко всем файлам, используемым в команде HelpLibManager. Я отредактирую свой ответ, чтобы включить код Wix, который я использую для запуска команды. - person Douglas Mendizábal; 13.01.2011
comment
Да, это было так: мне нужно было указать полный путь к файлу .msha в кавычках. Спасибо за вашу помощь и понимание Дуглас. - person Sameer Singh; 14.01.2011