Pierwszy zegar WiX tutaj.

Tworzę instalator dla mojego produktu przy użyciu WiX i próbuję sprawdzić, czy usługa MSMQ jest zainstalowana przed kontynuowaniem instalacji, postępując zgodnie z ta odpowiedź SO. Używam elementu Condition, zdefiniowanego w ten sposób:

  <Condition Message="MSMQ must be installed in order to proceed.">
    <![CDATA[MSMQ_INSTALLED<>"false"]]>
  </Condition>

Moja własność i wyszukiwanie w rejestrze wyglądają tak:

  <Property Id="MSMQ_INSTALLED" Value="false" Secure="yes">
    <RegistrySearch Id="Msmq.RS"
                    Root="HKLM"
                    Key="SOFTWARE\Microsoft\MSMQ"
                    Name="Values"
                    Type="raw"/>
  </Property>

Ale nigdy właściwie nie ocenia. Instalacja zatrzymuje się wraz z komunikatem, niezależnie od tego, czy klucz rejestru istnieje. Więc moje pytania to:

  1. Czy prawidłowo używam elementu Warunek?
  2. Co błędnie zdefiniowałem w ocenie?

Podczas dalszych testów odkryłem, że właściwość MSMQ_INSTALLED zawiera wartość „1: 0 2:”, niezależnie od szukanego klucza rejestru, istniejącego lub fałszywego.

EDYTUJ: element Condition znajduje się wewnątrz elementu Product; jest to ważne rozróżnienie ponieważ element Warunek jest przeciążony.

EDIT: zmodyfikowano warunek, aby użyć dyrektywy CDATA i odwrócić logikę warunku wewnętrznego, aby dokładniej odzwierciedlić problem.

0
grefly 11 sierpień 2011, 07:30
Nie jestem pewien, dlaczego zostało to odrzucone - zostaw mi komentarz, jeśli mogę wyjaśnić lub ujednoznacznić ten post.
 – 
grefly
11 sierpień 2011, 21:39

2 odpowiedzi

Najlepsza odpowiedź

Cóż, odpowiedź była na SO przez cały czas. Najwyraźniej wyszukiwanie klucza rejestru nie jest obsługiwane od razu z WiX, więc stworzyłem projekt akcji niestandardowych i użyłem tagu Binary, aby zaimportować go do mojego MSI, a następnie uruchomiłem akcję niestandardową w odpowiednim miejscu podczas instalacji. W moim przypadku było to przed LaunchConditions.

Dla odniesienia kod to:

public class CustomActions
{
    [CustomAction]
    public static ActionResult CustomAction1(Session session)
    {
        session.Log("Begin CustomAction1");

        var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MSMQ");
        session["MSMQ_INSTALLED"] = key == null ? "-1" : "1";

        return ActionResult.Success;

    }
}

(jedyna klasa w projekcie Custom Actions)

<Binary Id="WixCustomAction" SourceFile="C:\work\RelayMed\src\dev\WixCustomAction\bin\Debug\WixCustomAction.CA.dll"/>
<CustomAction Id="CheckMsmq" BinaryKey="WixCustomAction" DllEntry="CustomAction1" Execute="immediate" Return="check"/>

(Import pliku binarnego do WiX, w węźle Product).

<InstallUISequence>
  <Custom Action="CheckMsmq"
          Before="LaunchConditions"/>
</InstallUISequence>

(Uruchomienie akcji niestandardowej przed LaunchConditions)

Stan i Nieruchomość pozostały takie same jak w pierwotnym poście. RegistrySearch został całkowicie usunięty.

EDYTUJ: odnotowane usunięcie tagu RegistrySearch.

1
Community 23 maj 2017, 12:58

Twój autoring mówi „jeśli HKLM\SOFTWARE\Microsoft\MSMQ@Values ​​ma dosłowną wartość 'false', instalacja może być kontynuowana”.

Po prostu użyj „MSMQ_INSTALLED”, aby sprawdzić, czy w wartości rejestru znajduje się dowolny ciąg.

0
Bob Arnson 11 sierpień 2011, 07:55
Niestety wciąż ten sam problem.
 – 
grefly
11 sierpień 2011, 08:00
Zobacz mój powyższy komentarz: Po prostu użyj "MSMQ_INSTALLED", aby sprawdzić, czy w wartości rejestru znajduje się dowolny ciąg. MSI traktuje każdą wartość jako prawdziwą.
 – 
Bob Arnson
11 sierpień 2011, 16:38