2012-04-28 2 views
3

Я хочу включить различные dll в установку на основе определенных значений. Таким образом, я пытаюсь загрузить компонент на основе свойства, которое устанавливается с помощью пользовательского действия.WiX не может проверить свойство, которое задано с помощью CustomAction

В WXS файле:

... 
<Property Id="PropDllVersion" Value="0" /> 
... 
<CustomAction Id="CheckPropDllVersion" BinaryKey="CustomAction1.dll" DllEntry="GetPropVersion" Return="ignore" Execute="immediate"/> 
... 
<InstallExecuteSequence> 
    <Custom Action="CheckPropDllVersion" After="ValidateProductID" />  
</InstallExecuteSequence> 
... 
    <Component Id="Test" 
    Guid="B81F832D-2D96-4169-9BD0-8D77098FEC60"> 
    <Condition><![CDATA[PropDllVersion = "19"]]></Condition> 
    <File Id="File15" 
     Name="xyz.dll" 
     Vital="yes" 
     KeyPath="yes" 
     AssemblyManifest="File5" 
     AssemblyApplication="File5" 
     Assembly=".net" 
     DiskId="1" 
     /> 
    </Component> 
... 

Затем в файле пользовательского действия:

[CustomAction] 
     public static ActionResult GetPropVersion(Session session) 
     { 
    session["PropDllVersion"] = "19"; 
     } 

можно увидеть в файле журнала Msi, что это свойство изменяется на 19, однако xyz.dll не входит в установку. Похоже, что PropDllVersion не задано на уровне состояния или я что-то не так делаю ... Я попытался упорядочить его во многих других местах, пока он не работает ...

Если я использую глобальное свойство в вместо моей собственности это работает!

+2

Не знаете, почему у меня есть отрицательный рейтинг по этому вопросу. Не то чтобы я не пробовал все остальные решения, представленные здесь. Поблагодарите причину отрицательного рейтинга по этому вопросу ... – Samuel

ответ

3

Пожалуйста, обратите внимание, что private properties (его название содержит строчные буквы) используют их значения по умолчанию в InstallExecuteSequence. Поэтому вы должны использовать public property, например PROP_DLL_VERSION.

+0

Я пробовал это вчера, и он не работал, возможно, забыл скомпилировать пользовательские действия. Пробовал сейчас, и он работает! – Samuel

2

Где еще вы пытались упорядочить свое действие? Вам необходимо выполнить его последовательность перед действием CostInitialize.

Также вызовите действие FileCost, следующее за CostInitialize и действием CostFinalize.

Вы можете проверить документацию CostInitialize действия здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/aa368050%28v=vs.85%29.aspx

+0

Спасибо, попробуем это – Samuel

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