Wix - 多个功能之间的可重用组件

时间:2012-02-28 15:07:23

标签: wix wix3.5

考虑以下情况:

  • Project CommonLib
    • CommonLib.dll
  • 项目AExe
    • CommonLib.dll
    • AExe.exe
  • 项目BExe
    • CommonLib.dll
    • BExe.exe

Project AExe安装在%ProgramFiles%\AExe\bin和BExe %ProgramFiles%\BExe\bin中,但两者都使用相同的.MSI进行部署

如何将CommonLib.dll声明为通用组件,然后在AExe Directory[Ref]和BExe Directory[Ref]中重复使用?

我想做什么:

<Fragment>
<Component Id="C.CommonLib.dll" Guid="*">
  <File Id="Fi.CommonLib.dll" Source="<path>CommonLib.dll" KeyPath="yes"/>
</Component>
<Directory Id="ProgramFilesFolder">
  <Directory Id="Di.AExe" Name="AExe">
    <Directory Id="Di.AExeBin" Name="bin">
      <ComponentRef Id="C.CommonLib.dll"/>
    </Directory>
  </Directory>
  <Directory Id="Di.BExe" Name="BExe">
    <Directory Id="Di.BExeBin" Name="bin">
      <ComponentRef Id="C.CommonLib.dll"/>
    </Directory>
  </Directory>
</Directory>
</Fragment>

但这不起作用,因为Directory不允许Ref作为孩子。你会怎么编码呢?

P.S:我给出了2个项目的例子,但实际上有更多项目共享多个公共库,这就是为什么我要问:)

1 个答案:

答案 0 :(得分:2)

从Windows Installer Component table可以看出,组件只能与一个目录关联。但是,没有什么能阻止您创建安装相同文件的两个不同组件:

<Component Id="CommonLib.dll.1" Directory="Di.AExeBin">
  <File Id="CommonLib.dll.1" Source="...\CommonLib.dll"/>
</Component>

<Component Id="CommonLib.dll.2" Directory="Di.BExeBin">
  <File Id="CommonLib.dll.2" Source="...\CommonLib.dll"/>
</Component>

(注意:我的示例适用于wix3,您可以使用Directory =“...”属性,但当然您也可以将这些组件放在目录父元素下。)