WIX部署两个程序集到全局程序集缓存(GAC)。

3
使用 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:在SFN系统上,“MyDll.dll”目标文件由两个不同的组件通过“MyDllServicesModuleGac40Component.DDD7D974_FE9C_4BA3_BDD3_A1A3A23F8057”和“MyDllServicesModuleGac35Component.DDD7D974_FE9C_4BA3_BDD3_A1A3A23F8057”安装到“[TARGETDIR] \ GAC \”,这会破坏组件引用计数。 D:\ PROJECTS \ MyDll.Experimental.3.0.0 \ Project \ MyDll \ MyDll.Wix.Services \ MergeModule.wxs 34 1 MyDll.Wix.Services
安装程序应该能够检测到.Net35 dll被安装到C:\ Windows \ assembly的GAC中,而.Net40 dll被安装到C:\ Windows \ Microsoft.NET \ assembly的GAC中。
重命名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>

希望这能对某些人有所帮助!
1个回答

9
Aaron Stebner所述,在WiX中使用属性Assembly=".net",将会在MsiAssembly和MsiAssemblyName表格中为此组件创建条目,并标记其为GAC组件。这意味着该文件仅由此组件安装到GAC中,而不会安装到其父组件所在的目录中。该目录仅用于Windows Installer在创建管理安装点时,暂存该文件的副本。
因此,您两个组件的目录必须不同,因为它们具有相同的文件名。如果没有其他内容针对这些目录,则它们甚至不会被创建。我将我的GAC组件放在安装文件夹的子目录下:
<Directory Id="tmp_to_GAC" Name="tmp_to_GAC"> 

你需要为每一个全局程序集缓存(GAC)都准备一个。

谢谢,我进行了一些破解并得出了你所描述的内容。 - ISZ
2
让我为新手(因为我也是)添加一条注释:目录标签不需要在ID、名称或其他任何地方包含字符串“GAC”。 文件安装到GAC的唯一原因是Assembly=".net"属性。 - Matteo TeoMan Mangano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接