2014-11-24 2 views
6

Я пытаюсь создать собственное действие с атрибутом «Значение», я хочу передать параметры в код C# (TARGETDIR и версию).Как передать параметры пользовательскому действию?

Однако, я получаю сообщение о том, что DLLENtry и Value не могут сосуществовать. Но пользовательское действие без dllentry недействительно.

Это код:

<CustomAction Id="SetMAWPrefferences" 
       Value="InstallDir=[TARGETDIR];Version=2.0.0.1" 
       Return="check" 
       Execute="commit" 
       BinaryKey="ImportExportBinary"      
       /> 

И для этого я получаю эту ошибку:

Error 9 ICE68: Invalid custom action type for action 'SetMAWPrefferences'.

Любые идеи, как это сделать?

ответ

3

Обратите внимание, что вы используете Value атрибут в неправильном направлении:

...this attribute must be used with the Property attribute to set the property...Source


Основываясь на Creating WiX Custom Actions in C# and Passing Parameters статье вы должны:

  1. Создание свойств с заданными значениями:

    <Property Id="InstallDir" Value="someDefaultValue" /> 
    <Property Id="Version" Value="2.0.0.1" /> 
    
  2. Создания пользовательских действий для установки InstallDir свойства:

    <CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" /> 
    
  3. Создания пользовательских действий:

    <CustomAction Id="SetMAWPrefferences" 
        Return="check" 
        Execute="commit" 
        BinaryKey="ImportExportBinary" 
        DllEntry="YourCustomAction" /> 
    
  4. Расписания пользовательских действий для выполнения во время процесса установки:

    <InstallExecuteSequence> 
        <Custom Action="SetDirProp" After="CostFinalize" /> 
        <Custom Action="SetMAWPreferences" ... /> 
        ... 
    </InstallExecuteSequence> 
    
  5. доступа эти свойства из вашего пользовательского действия:

    [CustomAction] 
    public static ActionResult YourCustomAction(Session session) 
    { 
        // session["InstallDir"] 
        // session["Version"] 
    } 
    
+0

Привет, значения не передаются - я получаю null. –

+0

@ user1223457, я обновил ответ, помог ли он? – Yuriy

+0

Благодарю вас, ценности проходят! однако я получаю [TARGETDIR] как строку, а google не помогает - мне нужен путь, а не имя свойства. –

18

Есть два способа передачи параметров пользовательских действий, один будет работать для немедленного исполнения ЦСА, а другой будет работать для отложенных пользовательских действий.

Немедленное CA (не может быть откат):

Чтобы передать аргументы в немедленном CA вы можете установить свойство с требуемым именем и доступ к нему из сеанса.

В Wix:

<Property Id="MyProp" Value="MyValue" /> 

В CA:

[CustomAction] 
public static ActionResult NameOfMyCA(Session session) 
{ 
    string myArg = session["MyProp"]; 
} 

Отложенный CA:

Чтобы передать аргументы отсроченного CA вы должны использовать CustomActionData Property, этой свойство - это единственный доступ, который вы можете получить от отложенного центра сертификации.

В случае WIX, то ДПФ включает в себя класс CustomActionData который является словарь ключ/значение, и вы можете получить доступ к нему с помощью:

В Wix:

<CustomAction Id="MyCustomAction" .../> 

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" /> 

В CA:

[CustomAction] 
public static ActionResult NameOfMyCA(Session session) 
{ 
    CustomActionData data = session.CustomActionData; 

    //Access each argument like this: 

    string arg1 = data["Arg1"]; 
    string arg2 = data["Arg2"]; 
    string arg3 = data["Arg3"]; 
}  

Немедленное CA + CustomActionData:

Если вы хотите использовать CustomActionData для немедленного CA вы можете сделать что-то вроде этого:

В Wix:

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" /> 

В CA:

[CustomAction] 
public static ActionResult NameOfMyCA(Session session) 
{ 
    CustomActionData data = new CustomActionData(session["MyCustomAction"]); 

    //Access each argument like this: 

    string arg1 = data["Arg1"]; 
    string arg2 = data["Arg2"]; 
    string arg3 = data["Arg3"]; 
    string arg4 = session.Format(data["Arg4"]); 
} 

В случае arg4 после него содержит значение свойства, которое вам нужно будет получить к нему:

string arg4 = session.Format(data["Arg4"]); 

К сожалению, это будет работать только в немедленном CA, это означает, что если вы хотите использовать значение этого свойства в отложенном CA вам нужно будет иметь две пользовательских действий:

  • CA 1, чтобы установить CustomActionData для CA выполняется как незамедлительно. (Не забудьте назвать свойство с тем же именем, определенным для CustomAction.

  • CA 2 ЦС с определенной логикой, потребляющей CustomActionData.

Я предлагаю вам использовать CustomActionData для всех случаев этот способ проще конвертировать вам CA из Немедленное отсроченных и код легче читать

Ссылки:.

session.Format CustomActionData

+2

Это должен быть принятый ответ. – Izzy

 Смежные вопросы

  • Нет связанных вопросов^_^