2013-03-21 71 views
1

我有自定义操作,它将文件位置存储在即时阶段的属性中。 然后我在递延阶段另一个动作,读取这个属性,并创建文件:自定义属性为空

String configFilePath = session.CustomActionData["configPath"]; 
String configFileName = session.CustomActionData["configFile"]; 
... 

一切工作至今。 在卸载时,我想删除此文件,因此我有另一个已执行的操作,它在删除文件后执行。行动的作品,问题是该属性是空的(session.CustomActionData是空的)。 为什么?我也立即在卸载时立即设置它。如果我可以在自定义setUpConfig操作中读取它,为什么我无法在自定义removeConfig操作中读取它? 我想一个选择是在安装阶段将此值存储到注册表中,然后在卸载时从此处读取它。但我想知道为什么我可以在安装该程序时设置属性,以及为什么它没有设置为卸载。这两种情况都会执行设置proeprty的操作。

<CustomAction Id="ConfigFileLocation" Property="setUpConfig" Execute="immediate" 
Value="configPath=[WEBSITE];configFile=config_template.asp" /> 

<CustomAction Id="setUpConfig" BinaryKey="MyCustomAction" DllEntry="configFile" 
Execute="deferred" Impersonate="no" Return="check" /> 

<CustomAction Id="removeConfig" BinaryKey="MyCustomAction" 
DllEntry="removeCustomFile" Execute="deferred" Impersonate="no" Return="check" /> 

<InstallExecuteSequence> 
<Custom Action="ConfigFileLocation" After="LaunchConditions" /> 
<Custom Action="setUpConfig" Before="InstallFinalize"><![CDATA[NOT REMOVE="ALL"]] /> 
<Custom Action="removeConfig" After="RemoveFiles"><![CDATA[REMOVE="ALL"]] /> 
</InstallExecuteSequence> 

回答

1

将数据传递到递延自定义操作,你必须设置一个Property与相匹配的CustomAction/@Id的名称。您正在通过ConfigFileLocation自定义操作为setUpConfig自定义操作正确执行此操作。

但是,removeConfig自定义操作没有立即自定义操作,请设置名为removeConfigProperty

错误removeConfig自定义操作的CustomActionData属性为空。

+0

谢谢,它现在有效。 如果我使用RegistryValue将注册表的属性写入注册表并使用RegistrySearch将其读取到某个属性,是否还需要创建即时自定义操作以将数据传递给我的自定义卸载操作,还是直接从我的自定义卸载中读取注册表值在C#中的行动?还是有其他一些提议的方式? – Simon 2013-03-21 14:58:16

+0

您只需要将“Property”设置为与自定义操作同名即可。如果你想要的话,你可以直接使用RegistrySearch来设置'Property',这对你很有用。 – 2013-03-21 17:27:03