2013-03-21 107 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