如何使用 CustomAction 在 WIX 中设置目录路径?

How to set a Directory path in WIX using CustomAction?

我在WIX中有这样的目录结构

<Directory Id="TARGETDIR" Name="SourceDir" >
  <Directory Id="XXXFOLDER" Name="XXX">
    <Directory Id="YYYFOLDER" Name="YYY">
      <Directory Id="MAINFOLDER" Name="MAIN">

现在这个 MAINFOLDER 目录解析为 D:\XXX\YYY\MAIN\

我从解析为 E:\XXX\YYY\MAIN 的服务中获取 MAINFOLDER 的路径 我还在 cs 文件中分配了一个 customAction 下面是代码

[自定义操作]

    public static ActionResult GetNewDataPath(Session session)
    {
        
        sNewDataDir = xxxservice.GetPath();
        if (!String.IsNullOrEmpty(sNewDataDir.ToString()))
        {
            sNewDataDir+= "\MAIN\";
        }
        
        session["MAINFOLDER"] = sNewDataDir;
        return ActionResult.Success;
    }

我的自定义操作如下:

<CustomAction Id="GETDATAPATH" BinaryKey="InstallerCA"      
  DllEntry="GetNewDataPath" Execute="immediate"/>

这是安装顺序:

<Custom Action="GETDATAPATH" Before="CostFinalize" />

sNewDataDir 包含此值 =“E:\XXX\YYY\MAIN”,我分配给会话 [“MAINFOLDER”]。它被分配。但它并没有反映在 WIX 端,因为我的文件仍在复制到 D:\XXX\YYY\Main 尽管将它分配给 E:\XXX\YYY\Main 。我们如何使用 CustomAction 更改会话 ["MAINFOLDER"] 的目录路径?

通常是顺序问题。属性的值在 CostFinalize 操作 per MSDN 期间分配给目录路径。上面的自定义操作必须在执行序列中的 CostFinalize 运行之前的某个时间排序。

这也可能是特权问题:MAINFOLDER 可能是受限制的 public 属性 并且没有进入执行序列(如果您的自定义操作 运行 在执行序列中)。阅读有关 Restricted Public Properties 的内容,看看这是否是您的问题。

它也可以是您计算机的 anti-virus or some other issue 脚本引擎。

要有一个好主意(或者至少找到其他人可以找出真正的问题所在),您需要生成一份关于失败尝试的完整日志。大多数时候 voicewarmup(或 /l*v)是最好的使用价值(往往会给你大部分但不是所有你想要的,以及太多你不想要的)并且是大多数安装开发专家在生成他们使用和共享的日志时使用的值。但是,它确实会稍微减慢您的安装速度。