Как я передаю msiexec свойства пользовательскому действию WiX C#?

@TestPropertySource(properties = {"ticketing.profile=test"}) 

Не будет НЕ влиять на системное свойство ticketing.profile.

Ваш код не должен использовать системное свойство для получения значения, так как это означает, что вы не можете переопределить его.

В коде должен использоваться механизм выбора свойств пружины, который может быть привязан к системным свойствам, если не найден.

Типичный подход - установить свойство по умолчанию в коде (или в тесте, как вы сделали), а затем переопределить его, установив системное свойство.

27
задан Peter Mortensen 17 December 2015 в 09:27
поделиться

3 ответа

Если вместо

<CustomAction Id="SetCustomActionDataValue"
              Return="check"
              Property="Itp.Configurator.WixCustomAction"
              Value="[ENVIRONMENT],G2,[CONFIGFILE],[TARGETDIR]ITP_v$(var.VERSION_MAJOR)" />

написать так:

<CustomAction Id="SetCustomActionDataValue"
              Return="check"
              Property="Itp.Configurator.WixCustomAction"
              Value="Environment=[ENVIRONMENT];G=G2;ConfigFile=[CONFIGFILE];TargetDir=[TARGETDIR]ITP_v$(var.VERSION_MAJOR)" />

то вы сможете ссылаться на свои переменные так:

string env=session.CustomActionData["Environment"];
30
ответ дан 28 November 2019 в 04:48
поделиться

Ваше настраиваемое действие должно быть отложенным настраиваемым действием, чтобы запускаться после InstallFiles. У отложенных настраиваемых действий нет доступа к свойствам, но у них есть доступ к CustomActionData. См. это сообщение в блоге , где обсуждается, как с этим бороться. (Этот пример представляет собой настраиваемое действие VBScript, но вы сможете получить значение через коллекцию session.CustomActionData.)

8
ответ дан 28 November 2019 в 04:48
поделиться

Просто для полноты ; использование метода, описанного Джереми Лью в блоге выше, позволяет выполнять следующие действия:

Вызов:

msiexec /i ITP.Platform.2.msi ENVIRONMENT=QA CONFIGFILE=EnvironmentConfig.xml

С этим в файле .wxs:

<Property Id="ENVIRONMENT" Secure="yes" />
<Property Id="CONFIGFILE" Secure="yes" />
<Binary Id="Itp.Configurator.WixCustomAction.dll"
        SourceFile="$(var.Itp.Configurator.WixCustomAction.Path)" />

<CustomAction Id="SetCustomActionDataValue"
              Return="check"
              Property="Itp.Configurator.WixCustomAction"
              Value="[ENVIRONMENT],G2,[CONFIGFILE],[TARGETDIR]ITP_v$(var.VERSION_MAJOR)" />

<CustomAction Id="Itp.Configurator.WixCustomAction"
              Return="check"
              Execute="deferred"
              BinaryKey="Itp.Configurator.WixCustomAction.dll"
              DllEntry="ConfigureItpBrandSettings" />

<InstallExecuteSequence>
  <Custom Action="SetCustomActionDataValue" After="InstallFiles"></Custom>
  <Custom Action="Itp.Configurator.WixCustomAction" After="SetCustomActionDataValue"></Custom>
</InstallExecuteSequence>

С настраиваемым действием:

    /// <summary>
    /// CustomAction keys should be Environment,BrandId,ConfigPath,itpBasePath
    /// </summary>
    /// <param name="session"></param>
    /// <returns></returns>
    [CustomAction]
    public static ActionResult ConfigureItpBrandSettings(Session session)
    {
        string[] arguments = GetCustomActionDataArguments(session);

        string environmentName = arguments[0];
        string brandId = arguments[1];
        string configPath = arguments[2];
        string itpBasePath = arguments[3];

        //Do stuff

        return ActionResult.Success;
    }

    private static string[] GetCustomActionDataArguments(Session session)
    {
        string[] keys = new string[session.CustomActionData.Keys.Count];
        session.CustomActionData.Keys.CopyTo(keys,0);
        return keys[0].Split(',');
    }

работает.

Разбор аргументы CustomActionData довольно уродливы, но они работают. Надеюсь, кто-нибудь знает более элегантный способ сделать это.

14
ответ дан 28 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: