代码之家  ›  专栏  ›  技术社区  ›  Remco Schoeman

WIX 3.0从.NET项目生成功能

  •  2
  • Remco Schoeman  · 技术社区  · 15 年前

    我有一个很大的.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... 
    

    但是这两者之间的联系给我带来了麻烦, 功能可以引用组件组, 组件组引用组件, 组件包含在DirectoryRef中。

    定义DirectoryRef元素要引用的目录元素会给我带来麻烦。

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

    我有一个明显的印象,我是以错误的方式进行的,或者我缺少一些更深的洞察力。(我的妻子已经满3天了,所以我一点也不吃惊)

    有人能告诉我如何在这个黑暗和邪恶的问题上点燃蜡烛吗(没有双关语的意图…)

    1 回复  |  直到 8 年前
        1
  •  0
  •   Wim Coenen    15 年前

    如果只使用一个MSI,则无法将同一组件安装到不同的位置。您可以为同一个文件创建多个组件,但这有点难看,而且维护起来很麻烦。

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

    1. give the assembly a strong name by signing 在Visual Studio中 您只需启用“签名 程序集”复选框,并从项目生成新的密钥文件 设置。
    2. 在wix源文件中,添加 Assembly=".net" 属性 File element

    一旦程序集在GAC中注册,它就可以由任何应用程序加载。