0

我正在为使用 VS2012 和 VSTO 构建的 Word 模板开发安装程序。作为安装程序的一部分,我需要运行位于 Common Files 文件夹中的 vstoinstaller。x86 和 x64 之间的路径似乎不同,所以我认为使用 CommonFilesFolder 属性是一个很好的解决方案。但是,在构建 msi 包时出现错误:

Fehler  4   The system cannot find the file '[CommonFilesFolder]Microsoft Shared\VSTO\10.0\VSTOInstaller.exe'.  C:\trash\WordTemplate\WordTemplateSetup\Product.wxs 31  1   WordTemplateSetup

这是我的 wxs 的一部分:

<Binary Id="VSTOInstaller.exe" SourceFile="[CommonFilesFolder]Microsoft Shared\VSTO\10.0\VSTOInstaller.exe" />

我发现几个示例显示 wxs 预处理的差异,但是我需要在运行时引用正确的目录。

有什么建议吗?

4

2 回答 2

0

源路径(SourceFile 属性值)在构建时解析,而 MSI 变量值 [CommonFilesFolder] 在运行时解析。

使用 WIX 变量,如 $(var.Variable),获取构建机器上的路径。请参阅在 WiX 中使用环境变量

不过,我并没有完全掌握你想要使用的方法。如果此代码行(<Binary>元素)来自安装包,您将无法在另一个安装程序中运行一个安装程序。如果这条线来自 Burn bundle,那你为什么不使用<ExePackage>element?

于 2013-06-20T18:24:17.803 回答
0

最后我做到了:

    <?define VstoInstaller="C:\Program Files\Common Files\Microsoft Shared\VSTO\10.0\VSTOInstaller.exe"?>
<CustomAction Id="RunWordVstoInstall"
              Execute="immediate"
              Directory="INSTALLLOCATION"
              Return="asyncWait"
              ExeCommand="$(var.VstoInstaller) /i [INSTALLLOCATION]\WordTemplateInstaller.vsto" 
              />
<CustomAction Id="RunWordVstoUninstall"
              Execute="immediate"
              Directory="INSTALLLOCATION"
              Return="asyncWait"
              ExeCommand="$(var.VstoInstaller)  /u [INSTALLLOCATION]\WordTemplateInstaller.vsto" 
              />
<InstallExecuteSequence>
  <Custom Action="RunWordVstoUninstall" After="CostFinalize"><![CDATA[(&WordTemplateFeature <> 3)]]></Custom>
  <Custom Action="RunWordVstoInstall" After="CustomizeVsto"><![CDATA[(&WordTemplateFeature = 3)]]></Custom>
</InstallExecuteSequence>

在 CustomAction 条目中使用“假”目录和变量就可以了。对我很有用。

于 2013-06-25T09:29:00.003 回答