3

WiXを使用してSandcastleプロジェクトのビルド後にSandcastleヘルプファイルビルダーが作成するHelpLibraryManagerLauncherを実行することにより、自分のヘルプファイルをVisualStudio2010のヘルプライブラリに追加しようとしています。

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と、通常の[ヘルプライブラリマネージャー]ウィンドウがポップアップし、ヘルプライブラリが一覧表示されます。

もちろん、ヘルプライブラリマネージャーのGUIを操作せずに、WiXからヘルプファイルを自動的にインストールできるようにしたいのですが、何かが足りないはずです。コマンドプロンプトまたはWiXを使用して、ヘルプファイルをサイレントインストールすることはできませんか?(ただし、コマンドプロンプトからサイレントにアンインストールすることは問題なく機能します)。

これCacheLibUnsignedInstallRefusedExceptionも懸念事項です。署名されていない場合でも、WiX(およびMSI)にヘルプファイルをインストールさせるにはどうすればよいですか?

WiX v3.5.2415、Sandcastle v2.610621.1、およびSandcastle Help FileBuilderv1.9.1.0を使用しています。Sandcastle HelpFileBuilderが使用するHelp2.0コンパイラとHTMLHelpWorkshop hhc実行可能ファイルは、Visual Studio2008SDKからのものです。

どんな助けでも大歓迎です。

4

1 に答える 1

4

HelpLibManager.exeは、ヘルプコレクションのサイレントインストールを許可します。ただし、要件の1つは、ヘルプコレクションが署名された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ファイルの代わりにサイレントヘルプインストールで使用できます。.mshcファイルではなく.cabファイルを指すようにmshaファイルを更新してください。

/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ビットOSでのみ機能することに注意してください。64ビットOSもサポートする場合は、パスが32ビットOSと64ビットOSで異なるため、HelpLibManagerへの正しいパスを設定するためにさらにいくつかのカスタムアクションが必要になります。

于 2011-01-12T00:54:09.437 に答える