在延迟的.net自定义操作

时间:2015-08-24 20:52:13

标签: wix

我有一个用c#编写的自定义操作,可以管理计划任务。 CA使用ScheduledTasks表并基于this article。目前一切都运作良好,除了一个关键的事情: - )

我在使用此表的ExeAction列时遇到问题,该列应该表示计划任务要运行的EXE的完整路径和名称。安装程序运行时,会将EXE文件放在正确的目录中,并创建计划任务;但是,任务的exe操作始终包含我的.wix文件中指定的文件的原始ID(例如,[#fil489D713AB5785D45D8F9A2BC3ACD7847]),而不是我们正在安装的EXE的实际文件名。创建的任务的导出如下所示:

<Actions Context="Author">
    <Exec>
        <Command>[#fil489D713AB5785D45D8F9A2BC3ACD7847]</Command>
    </Exec>
</Actions>

这是我的CA的破产......

ScheduledTasks表定义中的列定义:

<!-- Actions -->
<columnDefinition
  name="ExeAction"
  length="255"
  type="string"
  category="formatted"
  modularize="property"
  nullable="no"
  description="The path of the executable to run." />

在InstallFiles之后安排的立即自定义操作方法中,我从行中提取ExeAction列,最终将值存储在会话中的CustomActionData实例中:

CustomActionData data = new CustomActionData();
CustomActionData details = new CustomActionData();

details["ExeAction"] = row["ExeAction"].ToString();
...
session["CreateScheduledTaskDeferred"] = data.ToString();

在相应的立即自定义操作方法之后安排的延迟自定义操作方法中,我从会话中提取ExeAction值并将值传递给将创建计划任务的ScheduledTasks库:

string exeAction = details["ExeAction"];
task.Actions.Add(new ExecAction(exeAction));

在我的主.wix文件中使用预定任务自定义操作如下:

<st:ScheduledTask
  Id="stask1F47C88A6951460CBE8973F741521206"
  ExeAction="[#fil489D713AB5785D45D8F9A2BC3ACD7847]"
  ... />

我尝试了以下内容:

  1. 在延迟自定义操作中,跟踪提取的ExeAction的值。当我这样做时,该值显示为正确的路径和exe名称!
  2. 在延迟自定义操作中,提取ExeAction值,然后将其转换为byte [],然后返回到存储在convertedExeAction变量中的字符串的新实例。我跟踪了这​​个新的convertedExeAction变量,看到它包含正确的完整路径和exe名称;但是,当我将此变量传递给我的计划任务库时,创建的任务仍然包含[#fil489D713AB5785D45D8F9A2BC3ACD7847]!
  3. 为了排除计划任务库的问题,我改为将ExeAction值的内容写入延迟自定义操作方法中的随机文件。输出包含[#fil489D713AB5785D45D8F9A2BC3ACD7847]。
  4. 我现在还不确定问题是什么。我试图浏览一些现有的wix扩展;但是,我找不到CA在.Net中写的任何地方。在指定可以包含属性的列时,这些扩展的XML表定义似乎使用了相同的modularize =“property”属性,这与我在此处所做的相符。

    任何建议都将不胜感激。

0 个答案:

没有答案