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>
...
它会创建对话框:
注意[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]
未展开:
为什么会发生这种情况?如何解决?
答案 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以确保。