是否有其他方法可以在延迟自定义操作中访问会话详细信息?

jch*_*cha 28 session windows-installer custom-action wix

我有一个自定义操作,需要低于将安装文件夹中的某些部分复制到VS2010文件夹的值

  1. VS2010目录路径(VS2010DEVENV属性)
  2. 安装路径(INSTALLLOCATION属性)

为了提供足够的权限,我将自定义操作设置为Execute='deferred' Impersonate='no'.但是在运行安装程序时,它会记录以下消息:

无法从非立即自定义操作访问会话详细信息

看来我们无法在"延期"自定义操作中访问属性(即session["VS2010DEVENV"])

有没有其他方法可以根据需要检索这些值?

Yan*_*nko 32

一定很有帮助.请特别注意页面底部,如何通过CustomActionData传递值的2个步骤的指导.

以下是摘录:

要将属性的值写入安装脚本,以便在延迟执行自定义操作期间使用:

  1. 将一个小的自定义操作插入到安装序列中,该序列将感兴趣的属性设置为与延迟执行自定义操作同名的属性.例如,如果延迟执行自定义操作的主键是"MyAction",则将名为"MyAction"的属性设置为您需要检索的属性X. 您必须在"MyAction"自定义操作之前在安装序列中设置"MyAction"属性.虽然任何类型的自定义操作都可以设置上下文数据,但最简单的方法是使用属性分配自定义操作(例如,自定义操作类型51).
  2. 在处理安装序列时,安装程​​序会将属性X的值作为属性CustomActionData的值写入执行脚本.

  • 您必须解析在延迟自定义操作中传递的字符串.例如,您可以传递`[VS2010DEVENV] | [INSTALLLOCATION]`,并在延迟CA中将CustomActionData拆分为`|`.如果你的CA使用DTF,它有一个类似字典的CustomActionData属性,你可以传递它像`vs2010 = [VS2010DEVENV]; location = [INSTALLLOCATION]`,并获得它像`session.CustomActionData ["vs2010"] `和`session.CustomActionData ["location"]` (11认同)
  • 感谢[参考](http://msdn.microsoft.com/en-us/library/aa370543.aspx).**CustomActionData**属性运行良好.但我想知道我们如何传递多个价值.就我而言,我需要VS2010和安装文件夹值.如果可能的话,你能给出一些提示吗? (3认同)

ber*_*hof 13

其他详细信息:可以使用"自定义操作类型51"中的以下语法传递多个属性值(这基本上只是设置属性值的自定义操作):

PROPERTY1=Value1;PROPERTY2=Value2;PROPERTY3=...
Run Code Online (Sandbox Code Playgroud)

可以从自定义操作中检索值,如下所示:

string prop1 = session.CustomActionData["PROPERTY1"];
string prop2 = session.CustomActionData["PROPERTY2"];
Run Code Online (Sandbox Code Playgroud)

以下是为ID为"MyCustomAction"的自定义操作设置属性值的示例:

<CustomAction
  Id="SetCustomActionPropertyValues"
  Property="MyCustomAction"
  Value="INSTALLDIR=[INSTALLDIR];EXECUTABLE=[#MyExecutableFile]" />
Run Code Online (Sandbox Code Playgroud)

(有关格式化语法的更多详细信息,请阅读此MSDN文章,在此示例中,该语法用于检索ID为"MyExecutableFile"的文件的安装位置)

  • 非常感谢这个具体的例子.正是我需要的.未来的访问者还应该看到[这个答案](http://stackoverflow.com/a/11233268/660536)以获取更多详细信息和示例. (6认同)