为什么MSI不扩展[CommonAppDataFolder]变量?

时间:2016-10-13 07:18:54

标签: wix windows-installer

Visual Studio 2015,WIX,MSI-installer。

起初我得到了目标平台。此代码位于我的UI xml-element:

<!-- Define platform-specific names and locations -->
<?if $(var.Platform) = x64 ?>
<?define PLATFORMPROGRAMFILESFOLDER = "ProgramFiles64Folder" ?>
<?else ?>
<?define PLATFORMPROGRAMFILESFOLDER = "ProgramFilesFolder" ?>
<?endif ?>

是的,我是通过预处理器完成的,但它没有任何问题,因为我分别为x86和x64构建了MSI-installer。我不知道如何在运行时做同样的事情。 如果有人告诉我怎么做,我会非常感激,但我目前的问题是关于其他......我有一个问题...

有效:

...
<!-- I am forced to define the INSTALLFOLDER again (inside of 'UI') because 
SelectInstallDirectory dialog doesnt see this property. -->
<Property Id="INSTALLFOLDER" Value="$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"/>
...
<RadioButtonGroup Property="INSTALLFOLDER">
  <RadioButton
    Text="[$(var.PLATFORMPROGRAMFILESFOLDER)]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Value="[$(var.PLATFORMPROGRAMFILESFOLDER)]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Height="13" Width="500" X="5" Y="5"/>
  <RadioButton
    Text="$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Value="$(env.ProgramData)\Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Height="13" Width="500" X="5" Y="20"/>
  <RadioButton
    Text="[AppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Value="[AppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Height="13" Width="500" X="5" Y="35"/>
</RadioButtonGroup>
...

它会创建对话框:

enter image description here

注意[AppDataFolder]使用...

我没有任何问题

$(env.ProgramData)由预处理器评估。因此,我要将每个$(env.ProgramData)\子字符串替换为[CommonAppDataFolder],以便在运行时评估值:

...
<!-- I am forced to define the INSTALLFOLDER again (inside of 'UI') because 
SelectInstallDirectory dialog doesnt see this property. -->
<Property Id="INSTALLFOLDER" Value="[CommonAppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"/>
...
<RadioButtonGroup Property="INSTALLFOLDER">
  <RadioButton
    Text="[$(var.PLATFORMPROGRAMFILESFOLDER)]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Value="[$(var.PLATFORMPROGRAMFILESFOLDER)]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Height="13" Width="500" X="5" Y="5"/>
  <RadioButton
    Text="[CommonAppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Value="[CommonAppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Height="13" Width="500" X="5" Y="20"/>
  <RadioButton
    Text="[AppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Value="[AppDataFolder]Autodesk\ApplicationPlugins\ProxyTools.bundle\"
    Height="13" Width="500" X="5" Y="35"/>
</RadioButtonGroup>
...

但是在这种情况下,当我启动MSI时出现错误,因为[CommonAppDataFolder]未展开:

enter image description here

为什么会发生这种情况?如何解决?

2 个答案:

答案 0 :(得分:0)

在回答你的previous question时,我应该想到并提到这一点。这里重要的是现在的背景。有问题的两个属性是RadioButton元素上的Text和Value属性。这些对应于RadioButton table中同名的列。我正要说Text是Formatted,而Value不是。{但它们都是格式化的。

所以我不能证明这种行为是正确的;它看起来应该有效。

但它很容易解决。您可以使用"ProgramFiles""ProgramData""AppData"等短值,而不是使用与文字匹配的值。然后在其他地方,可能在该对话框的“下一步”按钮上,添加SetProperty或SetDirectory自定义操作,将INSTALLFOLDER设置为先前存储在Value属性中的值,每个操作都以INSTALLFOLDER的值匹配短交替值值。这些自定义操作肯定会扩展属性引用。

通过将RadioButtonGroup属性与目录属性分开来更进一步(仅对其中一个使用INSTALLFOLDER),然后如果单击“上一步”并重新访问该页面,则会正确显示。

答案 1 :(得分:0)

您是否在目录引用中的任何位置引用了CommonAppDataFolder? AppDataFolder怎么样?它们都在MSI文件的目录表中吗? Windows Installer可能只评估Directory表中显式命名的目录,而不是您甚至不会使用的每个可能的文件夹属性。

此外,您的对话框是在CostInitialize和CostFinalize之后吗?直接检查MSI以确保。