2011-01-07 4 views
2

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

Я использую QuietExec пользовательские действия WIX, чтобы выполнить следующую команду:

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 и Sandboxle Help File Builder v1.9.1.0. Справку 2.0 для компилятора справки и HTML-справки hhc, которую использует Sandbule Help File Builder, из пакета Visual Studio 2008 SDK.

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

ответ

3

HelpLibManager.exe позволяет бесшумную установку коллекций справки. Однако одним из требований является то, что сборка справки должна содержаться в подписанном файле cab. Это означает, что вы не можете использовать файл .mshc для бесшумной установки.

Первое, что вам нужно сделать, это получить сертификат подписи кода. Если у вас его еще нет, вы можете приобрести его у VeriSign.

После того, как у вас есть сертификат подписи кода, вам необходимо преобразовать файл mshc в файл кабины. Вы можете достичь этого, используя команду makecab в командной строке.

makecab myhelp.mshc myhelp.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 "[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-битными ОС.

+0

Спасибо за точный ответ. Я выполнил ваши шаги, но теперь я получаю сообщение об ошибке «System.UriFormatException: Invalid URI: формат URI не может быть определен» при записи ошибки в EventLog при попытке установить справку напрямую с помощью HelpLibraryManagerLauncher. Если я запустил его без опции/silent, появится графический интерфейс, и установка пройдет отлично. Любая идея расхождения? –

+0

У меня никогда не было сбой в установке без исключения UriFormatException, так что это все догадки. Поскольку вы получаете исключение Uri, я полагаю, что HelpLibMangaer считает, что вы устанавливаете веб-контент вместо содержимого диска. Мое предложение состояло в том, чтобы включить полный путь ко всем файлам, которые используются в команде HelpLibManager. Я отредактирую свой ответ, чтобы включить код wix, который я использую для запуска команды. –

+0

Да, это было так: мне нужно было предоставить полный, цитируемый путь к файлу .msha. Спасибо за вашу помощь и понимание Дугласа. –

Смежные вопросы