2013-05-09 41 views
8

WiX 3.7を使用していますが、単純に< PackageGroupRef Id = "NetFx40Web" /> NetFlowインストーラパッケージを介して、またはsetup.exeに組み込むことができます。私のBundle.wxsファイルに私自身のパッケージを作成していましたが、まだ問題があります。マシンに既に.NETがインストールされていても、.NET 4をインストールしようとするようです。WiXバンドルに.NETインストーラを含めると、既にインストールされているかどうかが検出されません。

InstallContactDetectConditionの違いはわかりません。私はInstallConditionが評価が真である場合にパッケージをインストールするために使用され、そうでない場合はアンインストールすると考えます。ほとんどの前提条件のように、通常はpermanent = yesのものとどのように機能しますか? DetectConditionは、システム上に既に存在するかどうかをチェックする点でほぼ逆のことですが、そうであればインストールしません。

私の完全なBundle.wxsファイルは、Visual Studio WiXブートストラッププロジェクトにあります。私は、レジストリと.NET 4.0レジストリキーの範囲を調べようとしています。それが存在する場合、私は.NET 4.をインストールしたくないし、それがなければインストールする。しかし、これは動作していないし、常に.NETをインストールしようとします。

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Bundle 
     Name="MyProgramBootstrapper" 
     Version="1.0.0.0" 
     Manufacturer="Microsoft" 
     UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}"> 

     <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> 
     <Chain> 
      <PackageGroupRef Id="Netfx4Full"/> 
      <MsiPackage 
       Id="MyProgramInstaller" 
       SourceFile="$(var.MyProgramInstaller.TargetPath)" 
       Compressed="no"/> 
     </Chain> 
    </Bundle> 

    <Fragment> 
     <Property Id="NET40_FULL_INSTALL_32"> 
      <RegistrySearch 
       Id ="SearchNet40_32bit" 
       Root="HKLM" 
       Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" 
       Name="Version" 
       Type ="raw"/> 
     </Property> 
     <Property 
      Id="NET40_FULL_INSTALL_64"> 

      <RegistrySearch 
       Id ="SearchNet40_64bit" 
       Root="HKLM" 
       Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" 
       Name="Version" 
       Type ="raw" 
       Win64="yes" /> 
     </Property> 

     <WixVariable 
      Id="WixMbaPrereqPackageId" 
      Value="Netfx4Full" /> 
     <WixVariable 
      Id="WixMbaPrereqLicenseUrl" 
      Value="NetfxLicense.rtf" /> 
     <PackageGroup 
      Id="Netfx4Full"> 
      <ExePackage 
       Id="Netfx4Full" 
       Cache="no" 
       Compressed="no" 
       PerMachine="yes" 
       Permanent="yes" 
       Vital="yes" 
       SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe" 
       DetectCondition="NET40_FULL_INSTALL_32 OR NET40_FULL_INSTALL_64" 
       DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/> 
     </PackageGroup> 
    </Fragment> 
</Wix> 

ブートストラップインストーラログ:

[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: Netfx4Full, invalid payload: Netfx4Full, reason: 0x80070570 
[010C:2FB0][2013-05-10T12:07:07]i052: Condition 'NETFRAMEWORK40' evaluates to false. 
[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: MyInstaller, invalid payload: f4832BA0972BDE9B6FA8A19FBB614A7BA, reason: 0x80070570 
[010C:2FB0][2013-05-10T12:07:07]i101: Detected package: Netfx4Full, state: Absent, cached: Partial 

更新、溶液で。私は組み込みのWiX RegistrySearchを使用して、それがインストールされているかどうかを判断しました。バンドルプロジェクトでWixUtilExtension.dllを参照する必要がありました。更新されたBundle.wxsは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension" 
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" 
> 
    <Bundle 
     Name="MyProgramBootstrapper" 
     Version="1.0.0.0" 
     Manufacturer="Microsoft" 
     UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}"> 

     <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> 
     <Chain> 
      <PackageGroupRef Id="Netfx4Full"/> 
      <!-- TODO: Define the list of chained packages. --> 
        <!-- <MsiPackage SourceFile="path\to\your.msi" /> --> 
      <MsiPackage 
       Id="MyProgramInstaller" 
       SourceFile="$(var.MyProgramInstaller.TargetPath)" 
       Compressed="no" /> 
     </Chain> 
    </Bundle> 

    <Fragment> 
     <util:RegistrySearchRef Id="NETFRAMEWORK40"/> 
     <PackageGroup 
      Id="Netfx4Full"> 

      <ExePackage 
       Id="Netfx4FullExe" 
       Cache="no" 
       Compressed="no" 
       PerMachine="yes" 
       Permanent="yes" 
       Vital="yes" 
       SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe" 
       InstallCommand="/q /norestart /ChainingPackage FullX64Bootstrapper" 
       DetectCondition="NETFRAMEWORK40" 
       DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/> 
     </PackageGroup> 
    </Fragment> 
</Wix> 
+1

を私が正しくあなたの質問読んでいれば、私はあなたの質問のタイトルは誤解を招くと思います。問題は 'WixNetfxExtension'が動作しないことではありません。問題は、今日あなたが 'WixNetfxExtension'によってサポートされていない何かをしたいということです。他の人たちのよりわかりやすいタイトルは、「バンドルに圧縮された.NET Frameworkを含める方法」です。私の答えが完全に間違っている場合は、このコメントを無視してください。 :) –

+0

@RobMensching、正しい、タイトルは誤解を招いていた。私は、exeに隣接したインスタント・ルアーを含めることができます。これは私が望むものです。しかし、.NETがすでにインストールされていると私の条件が検出されず、理由がわかりません。 –

+0

質問に回答を追加する代わりに、答えとして追加することもできます。それは非常に多くのStackoverflowでサポートされています。 (実際の回答を閲覧するのではなく、すべてを読むことなく質問に埋め込み回答があることを確認することは難しいです) – Default

答えて

8

ここには多くの疑問があるようです。

あなたのバンドルに組み込まれているNETFXのインストール方法を根本的に質問しているようです。もしそうなら、今日はWixNetfxExtensionがそれをサポートしていないということは間違いありません。あなた自身のコピーを定義しなければならず、あなたのコピーは近くにあります(おそらくsrc\ext\NetFxExtension\wixlibにあるものからコピーされます)。バンドルに埋め込まれたNETFXを取得するために変更する必要があるのは、ExePackage/@Compressed属性を'yes'に設定することだけです。または、Compressed属性をオフのままにして、Bundle要素(デフォルトでは'yes')の圧縮に従います。

第2に、DetectConditionは、パッケージがマシン上にあるかどうかを判断します。 Burnは、パッケージがマシン上にあるかどうかに基づいて論理的な処理を行います。たとえば、インストール中にBurnはパッケージが存在しない場合はパッケージをインストールしますが、パッケージがすでに存在する場合は何も行いません。もちろん、存在しないパーマネントパッケージはアンインストール要求を無視します。

第3に、InstallConditionは、パッケージをマシンにインストールする必要があるかどうかを示します。それが真であると評価された場合、パッケージをインストールすることができます(存在しない場合、インストールを要求された場合)。 falseと評価された場合、パッケージは削除されます(存在する場合)。

メモ:レジストリ検索と条件は、NETXを検出するためにWiXツールセットで使用されているものとは少し異なります。

<util:RegistrySearch 
    Id="NETFRAMEWORK40" 
    Variable="NETFRAMEWORK40" 
    Root="HKLM" 
    Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" 
    Value="Install" 
    Result="value" /> 

DetectCondition

はその後、ちょうど "NETFRAMEWORK40"とき以下のWiXツールセットを使用していますNETFXの検出名です。その違いはあなたが見ている問題を説明するかもしれません。

+0

NET 40インストーラーを含む問題は実際にはありません。私の主な問題は、私の検出条件が正しく動作していないことであり、システムに.net 4.0がインストールされていても、alawaysはパッケージをインストールしようとします。 –

+0

私の答えは、WiXツールセットで使用されているNETFX 4検出を含むように更新されました。 –

+0

レジストリ検索を破棄し、DetectConditionをNETFRAMEWORK40に変更した後も、.NET 4を既にインストール済みのテストマシン(x64)に.NET4をインストールしようとしています。 –

2

私はこの答えで.NET Framework 4.5.2を使用しています。オフラインインストールとしての.NET Frameworkを含めるには:

  1. ことはあなたのChainPackageGroupRef要素を含める:

    <Bundle> 
        <Chain> 
         <PackageGroupRef Id="NetFx452" />   
         <MsiPackage ... /> 
        </Chain> 
    </Bundle> 
    
  2. Download the Microsoft .NET Framework 4.5.2 (Offline Installer)を、そしてあなたのブートストラッププロジェクトに追加します。 (私は「リソース」という名前のフォルダに置きます。)

  3. Fragment次の行を追加します。

    <Fragment> 
        <util:RegistrySearchRef Id="NETFRAMEWORK45"/> 
        <PackageGroup Id="NetFx452"> 
         <ExePackage Id="NetFx452" 
            Cache="no" 
            Compressed="yes" 
            PerMachine="yes" 
            Permanent="yes" 
            Vital="yes" 
            Name="NDP452-KB2901907-x86-x64-AllOS-ENU.exe" 
            SourceFile="Resource\NDP452-KB2901907-x86-x64-AllOS-ENU.exe" 
            DetectCondition="NETFRAMEWORK45" 
            InstallCommand="/q /norestart" />  
        </PackageGroup> 
    </Fragment> 
    
関連する問題