3

我有一个大型 .NET 源代码树(185 个 C# 和 VB 项目,其中 60 个是应用程序或网站),我想为其创建一个 wix 设置。总体思路是设置 1 个 msi 并使每个可执行文件成为一项功能,并将每个应用程序安装在单独的目录中。喜欢

%progfiles%/company/app1
                   /app2
                   /app3

到目前为止,我已经设法使用功能树创建了一个 wix 产品文件,并让 heat 工具为每个 .NET 项目生成片段文件。它们看起来像这样:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
    <DirectoryRef Id="Client.Binaries">
        ...component definitions...
    </DirectoryRef>
    <DirectoryRef Id="Client.Content">
        ...etc... 
    </DirectoryRef>
</Fragment>
<Fragment>
    <ComponentGroup Id="Client.Binaries">
       ...ComponentRefs referencing components defined under 
          the DirectoryRef with the same id...
    </ComponentGroup>
    ...etc... 

但是两者的链接给我带来了麻烦,Features 可以引用 ComponentGroups,ComponentGroups 引用 Components,Components 包含在 DirectoryRef 中。

定义 DirectoryRef 元素要引用的 Directory 元素给我带来了麻烦。

一些库被多个应用程序使用,因此 DirectoryRef 必须指向多个目录,并且多个 DirectoryRef(具有不同 id)必须指向同一个目录找到目录别名技巧),这两者似乎都是不可能的。

我有一种明显的印象,我正在以错误的方式处理它,或者我错过了一些更深入的洞察力。(没有惊喜,因为我的wix-fu已经整整3天了)

有人可以启发我如何在这个黑暗而邪恶的问题上点燃蜡烛(不是双关语......)

4

1 回答 1

1

如果您只使用一个 MSI,则无法将相同的组件安装到不同的位置。您可以为同一个文件创建多个组件,但这有点难看并且令人头疼。

更好的方法是只安装一次共享文件。对于共享的 .NET 程序集,这意味着您应该将它们放在 .NET全局程序集缓存(GAC) 中。您需要为每个共享程序集做两件事:

  1. 通过签名给程序集一个强名称;在 Visual Studio 中,您只需启用“签署程序集”复选框并从项目设置中生成一个新的密钥文件。
  2. 在您的 wix 源文件中,向File 元素Assembly=".net"添加一个属性

在 GAC 中注册程序集后,您的任何应用程序都可以加载它。

于 2009-11-12T10:05:13.793 回答