2013-02-13 5 views
4

Я пытаюсь создать пакет WiX, который устанавливает .NET Framework 4.0 перед установщиком MSI. Я проверил файл журнала для моего загрузочного файла с использованием аргумента командной строки \l log.txt и обнаружил, что ExePackage::DetectCondition всегда оценивает значение false.WiX 'Bundle' 'ExePackage' 'DetectCondition' всегда false

Я включаю WixNetFxExtension.dll в качестве ссылки в моем проекте Visual 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> 
    ... 

Я в том числе <PropertyRef Id="NETFRAMEWORK40FULL" /> во фрагменте, а затем происходит определить ExePackage для .NET Рамка 4.0 (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> 
    ... 

Я также проверил вывод сборки Visual Studio, чтобы подтвердить правильность ссылки на WixNetFxExtension.dll:

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" или DetectCondition="isInstalled = true" всегда имеет значение ложь. Даже установка 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 Full установлен и может вручную найти .NET 4.0 запись в моем реестре, как в обычном месте, так и под HKLM\SOFTWARE\Wow6432Node (я на 64-битной системе).

Я что-то упустил? Почему DetectCondition не работает для меня? Проект компилирует, запускает, развертывает полезную нагрузку (-ы) и в противном случае работает нормально.

+0

Извините за длинный пост. Попытка быть тщательной! И на этой ноте я использую WiX v3.7 – Terrabits

ответ

6

<PropertyRef Id="NETFRAMEWORK40FULL" /> является ссылкой на свойство MSI, но вы создаете связку. Связки имеют переменные, отличные от свойств MSI, хотя сам Burn предоставляет ряд переменных пакета, которые имитируют те, которые предоставляет MSI.

При этом WixNetFxExtension предоставляет группы пакетов для установщиков 4.0 NetFx. Вы можете заменить все это простым <PackageGroupRef Id="NetFx40Redist" />.

+0

Huh. Я не понял, что «NETFRAMEWORK40FULL» - это свойство MSI. Благодарю. Может быть, это вызывает логическую ошибку? Все еще не поняли эту часть, хотя «NetFx40Redist» полностью избегает этой проблемы. Любые мысли по этому поводу? Я уклонился от использования '', потому что я хотел управлять атрибутами установки пакета. Я решил перестать быть упрямым и дать ему шанс (по вашему предложению), и до сих пор он работает для меня; Я думаю, настройки по умолчанию в порядке. Спасибо за помощь :-) – Terrabits

+0

Да, вы не можете использовать свойство MSI в выражении Burn. Для этого требуется переменная Burn. –

+0

Тот факт, что переменные «Bundle» не могут использоваться в MSI, не имеет никакого смысла. Зачем даже их? – Brandon

2

Переменные, такие как NETFRAMEWORK40FULL, являются переменными MSI, вы не можете использовать их в Bundles.

Я успешно встроен.Версия .NET Framework 4.0 Client в моем пакете. Переменные условий, разрешенные из реестра.

Обратите внимание на синтаксис "&lt;&lt;" (что соответствует < <) в атрибуте DetectCondition. Эта страница может помочь http://wix.tramontana.co.hu/tutorial/com-expression-syntax-miscellanea/expression-syntax

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

    <Bundle 
     Name="My Program Name" 
     Version="1.2.0" 
     Manufacturer="SUSU" 
     UpgradeCode="some-guid"> 

     <Chain> 
      <PackageGroupRef Id="Netfx4"/> 
      <MsiPackage Id="MyProgramInstaller" SourceFile="product.msi" Compressed="yes"/> 
     </Chain> 

     <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense"> 
      <bal:WixStandardBootstrapperApplication 
       LicenseFile="license.rtf" 
       ShowVersion="yes" 
      /> 
     </BootstrapperApplicationRef> 
    </Bundle> 

    <Fragment> 

     <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Client" Value="Version" 
      Variable="Netfx4ClientVersion" /> 

     <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Client" Value="Version" 
      Variable="Netfx4x64ClientVersion" Win64="yes" /> 

     <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version" 
      Variable="Netfx4FullVersion" /> 

     <util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version" 
      Variable="Netfx4x64FullVersion" Win64="yes"/> 


     <PackageGroup Id="Netfx4"> 
      <ExePackage 
       Id="Netfx4" 
       Cache="no" 
       Compressed="yes" 
       PerMachine="yes" 
       Permanent="yes" 
       Vital="yes" 
       SourceFile="c:\Downloads\dotNetFx40_Client_x86_x64.exe" 
       InstallCommand="/q" 
       DetectCondition="(Netfx4FullVersion &lt;&lt; &quot;4&quot;) OR (Netfx4ClientVersion &lt;&lt; &quot;4&quot;) OR (Netfx4x64ClientVersion &lt;&lt; &quot;4&quot;) OR (Netfx4x64FullVersion &lt;&lt; &quot;4&quot;)" 
       /> 
     </PackageGroup> 

    </Fragment> 


</Wix> 
+1

Если вы хотите обнаружить версии выше 4.5, вам нужно использовать значение «Release» (вместо «Version»), потому что оно числовое. На этой странице показано, как его использовать: https://msdn.microsoft.com/en-CA/library/hh925568(v=vs.110).aspx –

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