Установка справки с помощью диспетчера библиотек справки и WiX - PullRequest
2 голосов
/ 07 января 2011

Я пытаюсь добавить свой собственный файл справки в библиотеку справки 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: 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)

При проверке журнала событий регистрируется следующая ошибка:

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,0.Компилятор справки 2.0 и HTML-мастерская справки hhc, которую использует построитель файлов справки Sandcastle, взяты из Visual Studio 2008 SDK.

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

1 Ответ

3 голосов
/ 12 января 2011

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-битной ОС разные.

...