WiX: условный внутренний текст не оценивается должным образом - PullRequest
0 голосов
/ 11 августа 2011

Первый таймер WiX здесь.

Я создаю установщик для моего продукта с использованием WiX, и я пытаюсь проверить, что MSMQ установлен перед продолжением установки, следуя этому SO-ответу ,Я использую элемент Condition, определенный следующим образом:

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

Мои свойства и RegistrySearch выглядят так:

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

Но он никогда не оценивается должным образом.Установка останавливается с сообщением, независимо от того, существует ли раздел реестра.Итак, мои вопросы:

  1. Правильно ли я использую элемент Condition?
  2. Что я неправильно определил в оценке?

При дальнейшем тестировании я обнаружил, что свойство MSMQ_INSTALLED содержит значение "1: 0 2:", независимо от реестраКлюч, который я ищу, либо существующий, либо поддельный.

EDIT : Элемент Condition существует внутри элемента Product;это важное различие , поскольку перегружен элемент Condition .

EDIT : измененное условие для использования директивы CDATA и инвертирования логики внутреннего условия для более точного отражения проблемы.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Ну, ответ был на SO все время . По-видимому, поиск ключа реестра не поддерживается сразу после установки WiX, поэтому я создал проект пользовательских действий и использовал двоичный тег для его импорта в мой MSI, а затем запустил пользовательское действие в соответствующем месте во время установки. В моем случае это было до LaunchConditions.

Для справки, код:

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;

    }
}

(единственный класс в проекте пользовательских действий)

<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"/>

(Импорт бинарного файла в WiX под узлом продукта.)

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

(выполнение настраиваемого действия перед LaunchConditions)

Состояние и имущество остались прежними от первоначального поста. Поиск в реестре был полностью удален.

РЕДАКТИРОВАТЬ : отмечено удаление тега RegistrySearch.

0 голосов
/ 11 августа 2011

Ваше авторство говорит: «Если HKLM \ SOFTWARE \ Microsoft \ MSMQ @ Values ​​имеет буквальное значение« false », то установка может продолжаться.»

Просто используйте «MSMQ_INSTALLED», чтобы проверить наличие любой строки, найденной взначение реестра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...