WIX将两个程序集部署到GAC

时间:2013-06-13 15:11:32

标签: wix

使用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_A1A3A23F8057'。这会破坏组件引用计数。 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 个答案:

答案 0 :(得分:7)

正如Aaron Stebner所述,

  

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

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

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

每个GAC都需要一个。