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:
- Czy prawidłowo używam elementu Warunek?
- 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.
2 odpowiedzi
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.
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.
Podobne pytania
Powiązane pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.