2014-01-28 5 views
1

Возможно ли, чтобы Installshield запускал пользовательское действие WiX, которое принимает дополнительный параметр, отличный от требуемого параметра Session? Например:Как создать пользовательское действие с помощью Installshield, которое вызывает пользовательское действие WiX с строковым параметром?

[CustomAction] 
public static ActionResult CustomAction1(Session session, string param) 
{ 
    session.Log(param); 
    return ActionResult.Success; 
} 

(обратите внимание на второй параметр)

Я создаю тип 1 настраиваемое действие через Installshield 2012 года принимает имя функции, и я не вижу никакого способа, чтобы добавить параметр. Я предполагаю, что я надеюсь на хак здесь, поэтому, если в базе данных MSI есть неподдерживаемый механизм, поделитесь.

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

+0

Пользовательские действия типа 1 принимают указатель на дескриптор msi (hMSI) в качестве аргумента. У WiX DTF CA есть собственный заглушка, который принимает это, а затем вызывает .NET. Класс Session является инкапсуляцией этого. См. Мой блог для получения дополнительной информации. http://blog.iswix.com/2008/05/deployment-tools-foundation-dtf-managed.html –

ответ

3

Я не думаю, что дополнительные параметры можно передать в пользовательский метод действий. Он вызывается установщиком Windows, и представляется разумным, что он ожидает четкой подписи.

Однако вы можете работать вокруг. Если вам нужно передать некоторые данные в пользовательское действие, вы можете использовать для этого объект Session.

Если настраиваемое действие немедленно, вы можете обратиться свойства MSI в пользовательском коде действий, как это:

session["PROPERTYNAME"] = "some value"; 

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

Если вы выполнили произвольное действие, есть механизм для передачи в него необходимых данных. Вы должны написать обычное непосредственное пользовательское действие «set-a-property» и передать необходимые данные в свойство, называемое именем вашего отложенного CA. Образец, как правило, гораздо более ясно, чем ее формирования в слово:

<!-- This is a subsidiary CA, note the property name is equal to the deferred CA name --> 
<CustomAction Id="SetForMyDeferredCA" Return="check" Property="MyDeferredCA" Value="source=[SourceFolder];target=[TargetFolder]"/> 
<!-- And this is the deferred CA which does the job --> 
<CustomAction Id="MyDeferredCA" Return="asyncWait" Execute="deferred" BinaryKey="CustomActions" DllEntry="MyMethodName" /> 

И внутри отложенного CA вы можете адресовать передаваемые данные, как это:

var source = session.CustomActionData["source"]; 
var target = session.CustomActionData["target"]; 

Надеется, что это помогает.

+0

Исправить. Вы не можете. Это по дизайну. –

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