从另一个.wxs文件引用UI元素

时间:2016-05-20 16:27:49

标签: wix windows-installer

我在一个单独的文件UserRegDialog.wxs中定义了一个自定义UI元素,使事情更加模块化。

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <UI Id="MyUserRegDialogUI" >

      <Property Id="Proceed">proceedbtn</Property>
      <Binary Id="proceedbtn" SourceFile="images/proceedbtn.bmp"/>
      <Binary Id="headerPic" SourceFile="images/header.bmp"/>
...
    </UI> </Fragment>

然后,在我的主要Product.wxs中,我试图引用我定义的UI元素:

    <Product Id="*" Name="CRxGUI" Language="1033" Version="1.0.0.0" Manufacturer="Derp LLC" UpgradeCode="bfcd8325-0025-463a-9589-c4c4713ce11d">
        <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" Description="My GUI Installer" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate />

    <UI>
      <UIRef Id="WixUI_InstallDir" />
      <UIRef Id="MyUserRegDialogUI" />
 ...

但是,wix构建器会报告无法找到的错误。使用.wxi文件,我只是将它们放在<?include myfile.wxi ?>中,但这似乎不适用于其他.wxs文件。我究竟做错了什么?如何从其他文件中引用我的自定义对话框?

Error   52  Unresolved reference to symbol 'WixUI:MyUserRegDialogUI' in section 'Product:*'.    ....\Product.wxs    13  1   MyWiXInstaller

我尝试重命名帮助器.wxs文件以匹配UI Id属性,但这没有帮助。

3 个答案:

答案 0 :(得分:0)

这两个文件是否在同一个文件夹中?您可能需要在<?include?>

中提供UserRegDialog.wxs的相对路径

我认为将此文件添加为链接(visual studio添加现有项目&gt;选择您的文件&gt;添加按钮下拉箭头&gt;“As Link”)可能会让编译器正确链接文件。

您可能会考虑的另一个选项,特别是如果您要使用多个单独的wxs文件,则将它们全部放在wixlib项目中并在主安装中引用该项目。我认为您可以将wixlib项目构建到扩展中,并包含一个DLL,就像wixuiextension和wixutilextension一样。

我会测试我的建议,但我没有可以在本周末快速检查的环境。

答案 1 :(得分:0)

编译完所有文件后,您只需链接它们即可。我想文件没有被编译,然后你得到了未解决的符号链接器错误。

使用Visual Studio:

检查您的文件是否设置为编译

在项目中,右键单击UserRegDialog.wxs,选择属性,然后在文件属性里面看到一个名为 Advanced <的部分/ em> Build Action 必须设置为 Compile

没有Visual Studio:

检查您的构建是否正在编译并正确链接您的UserRegDialog.wx。

正确链接项目的示例,编译的每个文件都链接在一起:

  candle MySetup.wxs UserRegDialog.wxs
  light -out setup.msi MySetup.wixobj UserRegDialog.wixobj

参考:

https://www.firegiant.com/wix/tutorial/upgrades-and-modularization/fragments/

答案 2 :(得分:0)

将文件重命名为UserRegDialog.wxi,然后您应该能够使用<?include UserRegDialog.wxi?>包含它。 <?include ?>语句应低于</Product>标记。