【问题标题】:WIX deploy two assemblies to GACWIX 将两个程序集部署到 GAC
【发布时间】:2013-06-13 15:11:32
【问题描述】:

使用 WIX,并尝试安装两个相同的程序集,一个用于 .Net35,另一个用于 .Net40。我正在使用两个单独的组件,但是 WIX 阻止了项目编译。

        <Directory Id="GAC40" Name="GAC">
            <Component Id="MyDllServicesModuleGac40Component" Guid="307675AA-8AEC-473B-A78A-FB362CCEDE2A" Win64="yes">
                <File Id="MyDllNet40DllGac" Name="MyDll.dll" KeyPath="yes" Assembly=".net" Source="..\MyDll\bin\Net40\MyDll.dll" />
            </Component>
        </Directory>
        <Directory Id="GAC35" Name="GAC">
            <Component Id="MyDllServicesModuleGac35Component" Guid="47E6BD1B-25CD-466D-945E-06DCF0F2A269" Win64="yes">
                <File Id="MyDllNet35DllGac" Name="MyDll.dll" KeyPath="yes" Assembly=".net" Source="..\MyDll\bin\Net35\MyDll.dll" />
            </Component>
        </Directory>

我收到的错误是:

错误29 ICE30: 'MyDllServicesModuleGac40Component.DDD7D974_FE9C_4BA3_BDD3_A1A3A23F8057' 和 'MyDllServicesModuleGac35Component.DDD7D974_FE9C_4BA3_BDD3_A1A3A23F8057':目标文件 'MYDLL.DLL' 由SFN系统上的两个不同的组件安装在 '[TARGETDIR] \ GAC \'。这会破坏组件引用计数。 D:\PROJECTS\MyDll.Experimental.3.0.0\Project\MyDll\MyDll.Wix.Services\MergeModule.wxs 34 1 MyDll.Wix.Services

安装程序应该能够检测到 .Net35 dll 安装到 GAC 的 C:\Windows\assembly,而 .Net40 dll 安装到 GAC 的 C:\Windows\Microsoft.NET\assembly。

重命名 DLL 不是一种选择。

谢谢!

更新

我在发布后自然想出了一个解决方案,似乎将组件包装在其他元素中让我可以让它工作。后来我阅读了 Tom Blodget 的帖子,所以这是正确的。

        <Directory Id="GAC1" Name="GAC">
            <Directory Id="GAC40" Name="GAC">
                <Component Id="MyDllServicesModuleGac40Component" Guid="307675AA-8AEC-473B-A78A-FB362CCEDE2A" Win64="yes">
                    <File Id="MyDllNet40DllGac" Name="MyDll.dll" KeyPath="yes" Assembly=".net" Source="..\MyDll\bin\Net40\MyDll.dll" />
                </Component>
            </Directory>
        </Directory>
        <Directory Id="GAC2">
            <Directory Id="GAC35" Name="GAC">
                <Component Id="MyDllServicesModuleGac35Component" Guid="FD74504A-6FE9-488E-9086-9DAD3024B35D" Win64="yes">
                    <File Id="MyDllNet35DllGac" Name="MyDll.dll" KeyPath="yes" Assembly=".net" Source="..\MyDll\bin\Net35\MyDll.dll" />
                </Component>
            </Directory>
        </Directory>

嗯,希望对某人有所帮助!

【问题讨论】:

    标签: wix


    【解决方案1】:

    正如Aaron Stebner所解释的,

    当您在 WiX 中为文件使用属性 Assembly=".net" 时,它将 为此在 MsiAssembly 和 MsiAssemblyName 表中创建条目 组件并将其标记为 GAC 组件。这意味着该文件 只会被这个组件安装到 GAC,它不会 安装到该组件的子目录。那 目录将仅由 Windows 安装程序用于暂存 创建管理安装点时使用该文件。

    因此,两个组件的目录必须不同,因为文件名相同。如果这些目录没有其他目标,它们甚至不会被创建。我将 GAC 组件放在安装文件夹的子目录下:

    <Directory Id="tmp_to_GAC" Name="tmp_to_GAC"> 
    

    每个 GAC 都需要一个。

    【讨论】:

    • 谢谢,我破解了它并想出了你所描述的内容。
    • 让我为新手添加一条评论(就像我一样):目录标签不需要在 ID 或名称中包含字符串“GAC”或其他任何内容。在 GAC 中安装文件的唯一原因是 Assembly=".net" 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多