如何将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自定义操作和传递参数文章,您应该:

  1. 用所需的值创build属性:

     <Property Id="InstallDir" Value="someDefaultValue" /> <Property Id="Version" Value="2.0.0.1" /> 
  2. 创build自定义操作来设置InstallDir属性:

     <CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" /> 
  3. 创build自定义操作:

     <CustomAction Id="SetMAWPrefferences" Return="check" Execute="commit" BinaryKey="ImportExportBinary" DllEntry="YourCustomAction" /> 
  4. 计划安装过程中执行的自定义操作:

     <InstallExecuteSequence> <Custom Action="SetDirProp" After="CostFinalize" /> <Custom Action="SetMAWPreferences" ... /> ... </InstallExecuteSequence> 
  5. 从您的自定义操作访问这些属性,如下所示:

     [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