修复由ILMerge引起的C#.NET中的冲突类型

时间:2010-11-29 17:14:41

标签: c# .net types ilmerge

我有一个有趣的问题,我想轻松解决。我有一个“库”程序集,在Visual Studio的解决方案中的“客户端”项目和“测试”项目中都被引用。问题是测试项目还引用了客户端项目,我们必须使用ILMerge将库程序集与客户端程序集合并以进行部署。由于库程序集与客户端程序集合并,因此当测试项目尝试构建时,我在最初引用的库程序集和合并程序集中存在的库程序集中的类型都会收到错误。

真正的问题是我们在客户端项目的后期构建步骤中运行ILMerge;最好的解决方案是将其转移到实际的部署过程中。但是,我们当前的工具将难以实现。

有没有办法告诉.NET该类型可能在多个程序集中并且没关系(考虑到它们实际上是相同的程序集,但只是在一种情况下与另一个程序集合并)?

3 个答案:

答案 0 :(得分:5)

所以,如果我理解正确的话,你的测试项目会引用库和客户端,而后者又将库合并到......所以,在测试的构建时你得到两个相同的引用图书馆。我认为解决方案是从测试项目中删除库引用,并仅引用客户端,它将提供您需要的所有内容。

答案 1 :(得分:2)

如果我理解正确,如果您只在测试中引用合并的程序集,您将可以访问所有类型,无需引用库程序集,从而消除了ILMerge的问题。

您可能希望添加对二进制“client”输出(可能是合并文件)的引用,并添加手动构建依赖项来控制正确的编译顺序。

我在我的一个项目中通过手动编辑CSPROJ文件,覆盖“CopyFilesToOutputDirectory”目标不仅编译,而且还在构建过程中合并“客户端”,但是后期构建事件也应该这样做(我同时做了一些其他不相关的更改,迫使我改变目标行为)。

然后,我编辑了引用合并DLL的其他项目文件,以使用这样的引用:

<Reference Include="MyMergedLib, Version=1.2.3.4, Culture=neutral, PublicKeyToken=3d58c5c8efc41aa9, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\MyMergedLib\$(OutputPath)MyMergedLib.dll</HintPath>
</Reference>

这确保VS始终采用正确的版本(调试/发布)。也许这有帮助。

答案 2 :(得分:0)

好吧,您可以使用自定义版本的ILLink(而不是ILMerge)来解决此问题。

或者,您可以调整它以删除重复的程序集。

Source Code here。请注意,ILLink是一个C ++程序..