2013-09-23 16 views
5

Mam aplikację, która wymaga .Net 4.0.3 (link).Wykrywanie WiX .Net 4.0.3

Znalazłem this article, który mówi mi, gdzie znajdę wersję .Net, która jest zainstalowana, ale wszystko, co mogę znaleźć, to lista uwzględnionych właściwości, które rozpoznaje kompilator WiX (here).

Próbowałem po kierunkach w this article, który mówi mi, aby użyć następującego kodu, ale to po prostu instaluje .NET 4 bez aktualizacji:

<PropertyRef Id="NETFRAMEWORK40FULL"/> 

<Condition Message="This application requires .NET Framework 4.0.3. Please install the .NET Framework then run this installer again."> 
    <![CDATA[Installed OR NETFRAMEWORK40FULL]]> 
</Condition> 

jak pójdę o co WiX sprawdzić konkretna aktualizacja 4.0.3, czy to przez predefiniowaną własność WiX czy też samemu sprawdzając wartość rejestru?

Odpowiedz

4

Po pewnym lekturze, do projektu dodałem projekt pakietu, który odwołuje się do mojego głównego Product w standardowym projekcie instalatora WiX (MyProject.Installer). Następnie użyłem RegistrySearch, aby znaleźć wersję pełnej instalacji .Net 4.

<Bundle ....> 
    <Chain> 
     <PackageGroupRef Id="Netfx4Full" /> 
     <PackageGroupRef Id="Netfx403Update" /> 
     <MsiPackage Id="MyMsi" SourceFile="$(var.MyProject.Installer.TargetPath)" Compressed="yes" DisplayInternalUI="yes" /> 
    </Chain> 
</Bundle> 
<Fragment> 
    <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="Netfx4Full"> 
     <ExePackage Id="Netfx4Full" 
       Cache="no" 
       Compressed="yes" 
       PerMachine="yes" 
       Permanent="yes" 
       Vital="yes" 
       SourceFile="$(var.ProjectDir)dotNetFx40_Full_x86_x64.exe" 
       DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193" 
       DetectCondition="Netfx4FullVersion AND (NOT VersionNT64 OR Netfx4x64FullVersion)" /> 
    </PackageGroup> 

    <PackageGroup Id="Netfx403Update"> 
     <ExePackage Id="Netfx403Update" 
       Cache="no" 
       Compressed="yes" 
       PerMachine="yes" 
       Permanent="yes" 
       Vital="yes" 
       SourceFile="$(var.ProjectDir)NDP40-KB2600211-x86-x64.exe" 
       DetectCondition="Netfx4FullVersion AND (Netfx4FullVersion &lt;&lt; &quot;4.0.3&quot; OR Netfx4FullVersion &lt;&lt; &quot;4.5&quot;)" /> 
    </PackageGroup> 
</Fragment> 

Warunkiem rozszerza się Netfx4FullVersion AND (Netfx4FullVersion << "4.0.3" OR Netfx4FullVersion << "4.5") bez XML ucieczkę.

Poniższe artykuły były pomocne:

Bundle skeleton code

Bundle package manifest

Defining searches using WiX variables

Chaining packages into a bundle

How to check for .Net versions

+0

Witam, nie rozumiesz, co robisz z tym? Pytasz o wersję środowiska .NET, która nie ulegnie zmianie po zainstalowaniu aktualizacji. Jeśli zainstalowana jest platforma .NET 4.0, pole Wersja pokaże 4.0.30319, niezależnie od tego, czy aktualizacja jest zainstalowana czy nie. Czy brakuje mi czegoś w twoim rozwiązaniu? Nie należy używać HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Updates \ Microsoft .NET Framework 4 Extended \ KB2600211 \? – Goran

+0

Jeśli pobierzesz najnowszą wersję środowiska .Net, czy aktualizacja 4.0.3 nie jest zawarta w pakiecie? Pamiętam testowanie tego na nowych maszynach wirtualnych, aby upewnić się, że instalator działał poprawnie. Jeśli próbowałeś tego i nie działa, a masz inne rozwiązanie, możesz to opublikować. – Sean

+0

Nie, nie jest częścią .net 4.0 (musimy poczekać na sp). Testuję go również na VM, a proponowane rozwiązanie nie działa poprawnie. Możesz wyszukać klucz rejestru 4.0.3 (który napisałem w poprzednim wpisie), jednak nadal nie jestem pewien, czy jest to poprawny sposób (wyszukiwanie klucza 4.0.3), ponieważ na moim komputerze programisty nie mam 4.0.3 zainstalowany, a asynchroniczny BCL nadal działa (nie wiem, czy twoja aplikacja wymaga tej aktualizacji z powodu używania async BCL). – Goran

3

Wartość wersji klucza rejestru "SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" będzie zawsze 4.0.30319 dla .net 4.0 (nawet jeśli zostały zainstalowane aktualizacje).

Oto kod użyłem w mojej wiązce szukać jeśli wersja NET 4.0.3 został już zainstalowany:

<util:RegistrySearch Root="HKLM" 
    Key="SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3" 
    Result="exists" 
    Variable="Netfx403" /> 
<util:RegistrySearch Root="HKLM" 
    Key="SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SKUs\.NETFramework,Version=v4.0.3" 
    Result="exists" 
    Variable="Netfx403x64" 
    Win64="yes" /> 

Następnie w ExePackage DetectCondition:

DetectCondition="Netfx403 AND (NOT VersionNT64 OR Netfx403x64)" 
Powiązane problemy