在Visual Studio WiX项目中使用WXI文件

5
我发现有几个来源都提到要使用包含文件(.wxi)将WiX安装文件拆分成单独的部分(变量、组件等)。这对我来说很有道理,所以我将节点从.wxs文件中拿出来放在一个单独的文件中,但是当我尝试在Visual Studio 2008中编译项目时,每个都会出现一个错误,指出它是“在‘Product:{...}’部分中未解析的符号‘...’的引用”。
我尝试在我的Product.wxs文件中使用标记���但似乎会破坏架构验证。如果这是包含的方式,那么它应该放在哪里呢?
我手头上有以下文件:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product ...>
    <Package .../>
    <Media .../>
    <Directory Id="TARGETDIR" Name="SourceDir">
    </Directory>
    <Feature Id="MainProgram" Level="1">
      <ComponentRef Id="ProductComponent" />
      <Feature Id="ContextMenu" Level="2">
        <ComponentRef Id="ContextMenuComponent" />
      </Feature>
    </Feature>
  </Product>
</Wix>

Components.wxi

<?xml version="1.0" encoding="utf-8"?>
<Include>
  <Fragment>
    <Component Id="ProductComponent" ...>
      <File .../>
    </Component>
    <Component Id="ContextMenuComponent" ...>
      <RegistryKey .../>
    </Component>
  </Fragment>
</Include>

我该如何在Visual Studio中构建它?脚本构建似乎更简单,但目前不是我的问题。

3个回答

12

包含文件应该被视为头文件,你只需要使用它们来声明需要在多个 .wxs 文件之间共享的公共变量等。

我的项目使用了约10个 .wxs 文件和一个单独的 .wxi 文件,在其中定义产品代码、升级代码等。

如果想更好地理解我所说的,请查看以下 Stack Overflow 问题:Wix Tricks & Best PracticesWiX Includes vs. Fragments,当然还有 Wix.chm 中的文档。


@sascha在这里有正确的建议。您在上面的系统中根本不需要包含任何内容。这就是candle/light的威力。 - Rob Mensching

4

尝试使用WXS扩展名而不是WXI。 我将我的文件拆分并使用WXS作为扩展名,它就可以工作了。 项目中的所有WXS文件都会被wixproj传递给wix编译器。


1
@David McEwing 是的,所有的.wxs文件都会被传递给candle(创建一堆.wixobjs的编译器)然后所有的.wixobjs都会被传递给light(将.wixobjs和.wixlibs“链接”起来以过滤掉你没有引用的内容并创建.MSI / .MSM)。 - Rob Mensching

0

在搜索我的问题时发现了这个问题,并想到要添加我的解决方案,以防有人与我经历相同。

如果您正在使用wixproj文件从Visual Studio进行编译,则似乎此项目类型不支持文件链接(添加现有项...添加为链接)。 您将在项目中获得链接,但在编译时将抱怨存在未解决的符号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接