5

MSIインストーラーの前に .NET Framework 4.0 をインストールする WiX バンドルを作成しようとしています。コマンド ライン引数を使用してブートストラップのログ ファイルを調べた\l log.txtところ、ExePackage::DetectConditionが常に false と評価されていることがわかりました。

WixNetFxExtension.dllVisual Studio 2010 Windows Installer XML Bootstrapper プロジェクトに参照として含めています。

NetFxExtension名前空間を含めています:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
    xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
    xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">

基本的なバンドル フレームワークの提供:

  <Bundle Name="RSA Bootstrapper"
      ...
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
      ...

    <Chain>
      <PackageGroupRef Id="NET40" />
      <PackageGroupRef Id="RSA_Application" />
    </Chain>
  </Bundle>
    ...

フラグメントに を含めてから、.NET Framework 4.0 ( )<PropertyRef Id="NETFRAMEWORK40FULL" />の ExePackage を定義します。NET40

  <Fragment>
    <PropertyRef Id="NETFRAMEWORK40FULL" />
    <PackageGroup Id="NET40">
    <ExePackage SourceFile="dotNetFx40_Full_x86_x64.exe"
        Compressed="yes"
        Cache="yes"
        DetectCondition="NETFRAMEWORK40FULL"
        InstallCommand="/norestart /passive /showrmui /ACTION=Install"
        Permanent="yes"
        InstallCondition="NOT NETFRAMEWORK40FULL"
        Vital="yes" >
    <ExitCode Value="0" Behavior="success" />
    <ExitCode Value="1641" Behavior="scheduleReboot" />
    <ExitCode Value="3010" Behavior="scheduleReboot" />
    <ExitCode Behavior="error" /> <!-- Everything else is an error -->
  </ExePackage>
    ...

WixNetFxExtension.dllまた、Visual Studio のビルド出力をチェックして、が正しく参照されていることを確認しました。

C:\Program Files (x86)\WiX Toolset v3.7\bin\Light.exe ... -ext "C:\Program Files (x86)\WiX Toolset v3.7\bin\WixNetFxExtension.dll"

問題はDetectCondition物件です。何に設定しても、評価されfalseます。

おそらくNETFRAMEWORK40FULL参照が信頼できないと考えて、代わりにこれを使用してみました:

<Fragment>
  <Variable Name="isInstalled"
      Type="numeric"
      Value="0"
      Persisted="yes"
      bal:Overridable="yes"/>
  <util:RegistrySearch Id="FindInstallKey"
      Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
      Value="Install"
      Result="exists"
      Variable="InstallKeyExists" />
  <util:RegistrySearch
      Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
      Value="Install"
      Variable="isInstalled"
      After="FindInstallKey"
      Condition="InstallKeyExists = true"
      Format="raw" />
</Fragment>

DetectCondition="isInstalled"orを設定すると、DetectCondition="isInstalled = true"常に false と評価されます。設定でもDetectCondition="true"常に false と評価されます!

これが私が話していることのログの断片です。DetectCondition="true"

[16A0:17B4][2013-02-13T13:01:43]i001: Burn v3.7.1224.0, Windows v6.1 (Build 7601: Service Pack 1), path: C:\Users\lalic\Documents\Visual Studio 2010\Projects\RSA Preset\Bootstrapper\bin\Release\Bootstrapper.exe, cmdline: '/l log.txt -burn.unelevated BurnPipe.{33090847-CC78-445B-BAAA-564B840B7E8E} {38F95C6A-EC0F-4402-951B-FABFC5827CB6} 6296'
[16A0:17B4][2013-02-13T13:01:43]i000: Setting string variable 'WixBundleLog' to value 'C:\Users\lalic\Documents\Visual Studio 2010\Projects\RSA Preset\Bootstrapper\bin\Release\log.txt'
[16A0:17B4][2013-02-13T13:01:43]i000: Setting string variable 'WixBundleOriginalSource' to value 'C:\Users\lalic\Documents\Visual Studio 2010\Projects\RSA Preset\Bootstrapper\bin\Release\Bootstrapper.exe'
[16A0:17B4][2013-02-13T13:01:43]i052: Condition '((VersionNT = v5.1) AND (ServicePackLevel >= 3)) OR ((VersionNT = v5.2) AND (ServicePackLevel >= 2)) OR ((VersionNT = v6.0) AND (ServicePackLevel >= 1)) OR (VersionNT >= v6.1)' evaluates to true.
[16A0:17B4][2013-02-13T13:01:43]i000: Setting string variable 'WixBundleName' to value 'RSA Bootstrapper'
[16A0:17B4][2013-02-13T13:01:43]i100: Detect begin, 2 packages
[16A0:17B4][2013-02-13T13:01:43]i052: Condition 'true' evaluates to false.
[16A0:17B4][2013-02-13T13:01:43]i103: Detected related package: {D431417D-F0AC-4CFB-8E25-E27F5B8101D9}, scope: PerMachine, version: 2.1.15.0, language: 0 operation: MajorUpgrade
[16A0:17B4][2013-02-13T13:01:43]i101: Detected package: dotNetFx40_Full_x86_x64.exe, state: Absent, cached: None
[16A0:17B4][2013-02-13T13:01:43]i101: Detected package: RSA_Preset.msi, state: Absent, cached: None
[16A0:17B4][2013-02-13T13:01:43]i199: Detect complete, result: 0x0
[16A0:17B4][2013-02-13T13:02:04]i200: Plan begin, 2 packages, action: Install
[16A0:17B4][2013-02-13T13:02:04]i052: Condition 'NOT NETFRAMEWORK40FULL' evaluates to true.

具体的には i052: Condition 'true' evaluates to false. 、実際Condition 'NOT NETFRAMEWORK40FULL' evaluates to true.には.NET 4.0フルがインストールされていて、通常の場所と下の両方で.NET 4.0エントリをレジストリで手動で見つけることができますHKLM\SOFTWARE\Wow6432Node(私は64ビットシステムを使用しています)。

何か不足していますか?DetectCondition が機能しないのはなぜですか? プロジェクトはペイロードをコンパイル、実行、デプロイし、それ以外は正常に動作します。

4

2 に答える 2

7

<PropertyRef Id="NETFRAMEWORK40FULL" />は MSI プロパティへの参照ですが、バンドルを作成しています。バンドルには、MSI プロパティとは異なる変数がありますが、Burn 自体は、MSI が提供するものを模倣する多数のバンドル変数を提供します。

そうは言っても、WixNetFxExtension は 4.0 NetFx インストーラー用のパッケージ グループを提供します。これらすべてを単純な に置き換えることができます<PackageGroupRef Id="NetFx40Redist" />

于 2013-02-14T04:56:10.193 に答える