如何将parameter passing给自定义操作?
我试图用“Value”属性创build自定义动作,我想将parameter passing给C#代码(TARGETDIR和版本)。
但是,我收到一个错误,指出DLLENtry和Value不能共存。 但是没有dllentry的自定义操作是无效的。
这是代码:
<CustomAction Id="SetMAWPrefferences" Value="InstallDir=[TARGETDIR];Version=2.0.0.1" Return="check" Execute="commit" BinaryKey="ImportExportBinary" />
为此,我得到这个错误:
错误9 ICE68:操作“SetMAWPrefferences”的自定义操作types无效。
任何想法如何做到这一点?
请注意,您以错误的方式使用Value
属性:
…此属性必须与Property属性一起使用来设置属性… Source
基于在C#中创buildWiX自定义操作和传递参数文章,您应该:
-
用所需的值创build属性:
<Property Id="InstallDir" Value="someDefaultValue" /> <Property Id="Version" Value="2.0.0.1" />
-
创build自定义操作来设置
InstallDir
属性:<CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" />
-
创build自定义操作:
<CustomAction Id="SetMAWPrefferences" Return="check" Execute="commit" BinaryKey="ImportExportBinary" DllEntry="YourCustomAction" />
-
计划安装过程中执行的自定义操作:
<InstallExecuteSequence> <Custom Action="SetDirProp" After="CostFinalize" /> <Custom Action="SetMAWPreferences" ... /> ... </InstallExecuteSequence>
-
从您的自定义操作访问这些属性,如下所示:
[CustomAction] public static ActionResult YourCustomAction(Session session) { // session["InstallDir"] // session["Version"] }
有两种方法可以将parameter passing给自定义动作,一种可以用于立即执行CA,另一种可以用于延迟自定义动作。
即时CA(不能回滚):
为了将parameter passing给直接CA,您可以使用所需的名称设置属性,并从会话中访问它。
在Wix:
<Property Id="MyProp" Value="MyValue" />
在CA中:
[CustomAction] public static ActionResult NameOfMyCA(Session session) { string myArg = session["MyProp"]; }
延期CA:
为了将parameter passing给延期CA,您需要使用CustomActionData属性 ,该属性是唯一可以从延期CA访问的属性。
对于WIX,DTF包含一个CustomActionData类,它是一个键/值字典,您可以使用以下方法访问它:
在Wix:
<CustomAction Id="MyCustomAction" .../> <Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />
在CA中:
[CustomAction] public static ActionResult NameOfMyCA(Session session) { CustomActionData data = session.CustomActionData; //Access each argument like this: string arg1 = data["Arg1"]; string arg2 = data["Arg2"]; string arg3 = data["Arg3"]; }
立即CA + CustomActionData:
如果你想为你的即时CA使用CustomActionData,你可以这样做:
在Wix:
<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />
在CA中:
[CustomAction] public static ActionResult NameOfMyCA(Session session) { CustomActionData data = new CustomActionData(session["MyCustomAction"]); //Access each argument like this: string arg1 = data["Arg1"]; string arg2 = data["Arg2"]; string arg3 = data["Arg3"]; string arg4 = session.Format(data["Arg4"]); }
在Arg4的情况下,因为它包含一个属性的值,您将需要像这样访问它:
string arg4 = session.Format(data["Arg4"]);
不幸的是,这只能在即时CA中工作,这意味着如果你想在延期CA中使用这个属性的值,你将需要有两个自定义操作:
-
CA 1将CA的CustomActionData设置为立即执行。 (请记住为您的CustomAction定义相同的名称。
-
CA 2具有使用CustomActionData的特定逻辑的CA.
我build议你在所有情况下使用CustomActionData,这种方式更容易将CA从Immediate转换为Deferred,代码更易于阅读。
参考文献:
session.Format CustomActionData