2009-05-07 3 views
26

У меня есть файл MSI, созданный с помощью Wxs 3.0. Мой MSI ссылается на пользовательское действие C#, написанное с использованием нового C# Custom Action project.Как передать свойства msiexec для пользовательского действия WiX C#?

Я хочу, чтобы передать аргумент MSIexec, который получает направляется к моему настраиваемое действие - например:

MSIexec/I MyApp.msi окружающая среда = Тест #

В моем файле .wxs, я имею в виду мой настраиваемое действие, как это:

<Property Id="ENVIRONMENT"/> 
<Binary Id="WixCustomAction.dll" SourceFile="$(var.WixCustomAction.Path)" /> 
<CustomAction Id="WixCustomAction" BinaryKey="WixCustomAction.dll" DllEntry="ConfigureSettings"/> 
<InstallExecuteSequence> 
    <Custom Action="WixCustomAction" After="InstallFiles"></Custom> 
</InstallExecuteSequence> 

Мой C# настраиваемое действие устанавливается следующим образом:

[CustomAction] 
public static ActionResult ConfigureSettings(Session session) 
{ 

} 

Я ожидал, что найду ссылку на эту недвижимость:

string environmentName = session.Property ["ОКРУЖАЮЩАЯ СРЕДА"];

но это не работает.

Как получить доступ к свойству, которое я передал в msiexec в моем пользовательском действии?

ответ

29

Если вместо

<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"]; 
+0

Одна вещь, чтобы не из образцов, не должно быть никаких пробелов вокруг точек с запятой. – epotter

8

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

+2

Обратите внимание, что ссылка на сообщение в блоге больше не работает. Новая ссылка: http://blogs.claritycon.com/sajojacob/2008/02/29/customactiondata-in-wix-with-deferred-custom-actions/ –

+3

@ SébastienNussbaumer: ну, эта ссылка тоже мертва. .. jlew: вы должны опубликовать фактический код здесь, в отличие от ссылок. – woohoo

14

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

Призвание:

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 довольно уродлив, но он работает. Надеюсь, кто-то знает более элегантный способ сделать это.

8

Вот мой рабочий код:

<Binary Id="MyCA" SourceFile="..\bin\ChainerRun.CA.exe" /> 

<CustomAction Id="SetCustomActionDataValue" Return="check" Property="CustomActionData" Value="TARGETDIR=[TARGETDIR];AA=Description;" /> 

<CustomAction Id="ReadAndSet" 
      BinaryKey="MyCA" 
      DllEntry="ReadAndSet" 
      Execute="immediate" 
      HideTarget="no" 
      Return="check" /> 

<InstallExecuteSequence> 
    <Custom Action="SetCustomActionDataValue" Before="InstallFiles" /> 
    <Custom Action="ReadAndSet" After="SetCustomActionDataValue" /> 
</InstallExecuteSequence> 

В функции пользовательского действия C#:

[CustomAction] 
public static ActionResult ReadAndSet(Session session) 
{ 
    ActionResult retCode = ActionResult.NotExecuted; 

    System.Diagnostics.Debug.Assert(false); 

    session.Log("ReadAndSet() begins ..."); 

    string installLocation = session.CustomActionData["TARGETDIR"]; 
    string hostName = session.CustomActionData["AA"]; 
    ... 
} 
+1

Спасибо! Это, кажется, самый яркий пример здесь и работал как шарм. –

0

Если мы говорим о Wix Sharp (а не простой Wix с его XML материал), добавив пользовательское свойство кусок пирога. Все, что вам нужно сделать, это установить Свойство UsesProperties для вашего управляемого действия.

Например, если вы хотите добавить пользовательское свойство с именем «MYPROP», просто определить свои действия так:

new ElevatedManagedAction(nameof(CustomActions.MyCustomAction)) 
{ 
    Condition = Condition.Installed, 
    When = When.Before, 
    Step = Step.RemoveFiles, 
    Return = Return.check, 
    Execute = Execute.deferred, 
    UsesProperties = "MYPROP" 
} 

Установите значение свойства с помощью MSIexec командной строки:

msiexec /i my.msi MYPROP=MYVALUE 

И тогда вы сможете получить к нему доступ из своего пользовательского действия:

[CustomAction] 
public static ActionResult MyCustomAction(Session session) 
{ 
    session.Log("MYPROP VALUE: " + session.CustomActionData["MYPROP"]); 
    return ActionResult.Success; 
} 

Если свойство не установлено через командную строку, значением по умолчанию будет пустая строка.