【问题标题】:Fixing conflicting types in C# .NET caused by ILMerge修复由 ILMerge 引起的 C# .NET 中的冲突类型
【发布时间】:2010-11-29 17:14:40
【问题描述】:

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

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

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

【问题讨论】:

  • 您能描述一下为什么要引用原始库程序集和合并程序集吗?
  • @chibacity 我没有引用合并的程序集。我指的是“客户端”项目和“库”程序集。不幸的是,当构建“客户端”项目时,它使用 ILMerge 合并到“库”程序集中。我将编辑问题以更清楚地反映这一点。
  • 是否会在客户端上使用 ILMerge 的“内部”设置(以防止库从客户端程序集中公开可见)解决此问题?
  • 感谢您的澄清,我可以看到现在发生了什么。

标签: c# .net types ilmerge


【解决方案1】:

所以,如果我理解正确,您的测试项目有对库和客户端的引用,而客户端又将库合并...所以,在构建测试时,您会得到两个相同的引用图书馆。我认为解决方案是从测试项目中删除库引用,只引用客户端,这将拥有你需要的一切。

【讨论】:

  • 这需要添加对大量不需要的代码的引用。这是一个痛苦的代价。
  • @Brian 这是一个测试项目。
  • @chibacity:哦,我错过了。是的,在这种情况下,亚历克斯的解决方案是有道理的。 +1
  • +1 @Alex 起初我以为这里会先有鸡还是先有蛋,但是如果测试项目只引用客户端项目,那么所有依赖项都应该解决。
  • 编译需要多一秒钟。惨痛的代价?
【解决方案2】:

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

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

我在我的一个项目中通过手动编辑 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 始终采用正确的版本(调试/发布)。也许这会有所帮助。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多