3

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

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

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

4

3 回答 3

5

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

于 2010-11-29T18:10:11.247 回答
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 始终采用正确的版本(调试/发布)。也许这有帮助。

于 2010-11-29T18:24:15.993 回答
0

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

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

请参阅此处的源代码。请注意,ILLink 是一个 C++ 程序。

于 2010-11-29T18:10:21.730 回答