Wix Custom Action - session empty and error on deferred action

被刻印的时光 ゝ 提交于 2019-11-28 02:22:43

UPDATE: It is late, I didn't see this on first sight, but only immediate mode custom actions can be run from the setup GUI. Make a new, immediate mode custom action to set a value to your PUBLIC property CONN, and then set the value of CONN via a type 51 custom action to be assigned to the Id of the deferred mode custom action - as described below.


SecureCustomProperties: Add the property you specify to SecureCustomProperties by setting the Secure="yes" attribute:

<Property Id="MYPROPERTY" Secure="yes">Send this text to deferred mode</Property>

Name Match: the property name you assign the value to must match the deferred mode custom action Id. Looks OK in your source.

More Technical: the Property attribute's value of the type 51 action must be identical to the Id of the custom action that is consuming CustomActionData:

<!-- Declare property with value -->
<Property Id="MYPROPERTY" Secure="yes">Send this text to deferred mode</Property>

<!-- Type 51 CA: Send value of MYPROPERTY to the deferred mode CA named MyAction -->
<CustomAction Id="MyAction.SetProperty" Return="check" Property="MyAction" Value="[MYPROPERTY]" />

<!-- The deferred mode custom action -->
<CustomAction Id="MyAction" Return="check" Execute="deferred" BinaryKey="CAs" DllEntry="MyAction" />

<!-- ... -->

<!-- Inserting the CAs in sequence -->
<InstallExecuteSequence>
    <Custom Action="MyAction.SetProperty" After="InstallInitialize" />
    <Custom Action="MyAction" Before="InstallFinalize" />
</InstallExecuteSequence>

Here are some resources:


Just for debugging reference. And you can use: string data = session["CustomActionData"];


Tell you what, let me slide in the code to test using VBScript so you can use message boxes. Should not be necessary, just in case you have a debugging issue:

VBScript "Simple.vbs" (save as file):

MsgBox Session.Property("CustomActionData")

WiX markup change:

<Binary Id='Simple.vbs' SourceFile='Simple.vbs' />
<CustomAction Id="MyAction" Return="check" Execute="deferred" BinaryKey="Simple.vbs" VBScriptCall='' />

Just in case that is easier. Recommend you use VBScript for debugging only. I like VBScript to get a "heartbeat" when I want to eliminate all other error sources.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!