WIX将两个程序集部署到GAC

WIX将两个程序集部署到GAC,wix,Wix,使用WIX,并尝试安装两个相同的程序集,一个用于.Net35,另一个用于.Net40。我使用两个独立的组件,但是WIX阻止了项目的编译 <Directory Id="GAC40" Name="GAC"> <Component Id="MyDllServicesModuleGac40Component" Guid="307675AA-8AEC-473B-A78A-FB362CCEDE2A" Win64="yes">

使用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:目标文件“MyDll.dll”由SFN系统上的两个不同组件安装在“[TARGETDIR]\GAC\”中:“MyDllServicesModuleGac40Component.DDD7D974_FE9C_4BA3_BDD3_A1A3A23F8057”和“MyDllServicesModuleGac35Component.DDD7D974_FE9C_4BA3_BDD3_a3a23f8057”。这将中断组件引用计数。D:\PROJECTS\MyDll.experiative.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>

好吧,希望它能帮助别人

如所述

当您对WiX中的文件使用属性Assembly=“.net”时,它将 在MSISassembly和MSISassemblyName表中为此创建条目 组件并将其标记为GAC组件。这意味着文件 将仅通过此组件安装到GAC,而不会 安装到组件的子目录。那个 目录将仅由Windows Installer用于暂存的副本 创建管理安装点时创建该文件

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

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


每个GAC都需要一个

谢谢,我对它进行了黑客攻击,并提出了您所描述的内容。让我为新手添加一条评论(就像我一样):目录标记不需要在ID、Name或其他任何内容中包含字符串“GAC”。在GAC中安装文件的唯一原因是Assembly=“.net”属性。