代码之家  ›  专栏  ›  技术社区  ›  Steven Oxley

修复由ilmerge导致的c.net中的冲突类型

  •  3
  • Steven Oxley  · 技术社区  · 15 年前

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

    真正的问题是我们在客户机项目的构建后步骤中运行了ilmerge;最好的解决方案是将其转移到实际的部署过程中。然而,我们当前的工具将使这一点难以实现。

    有没有一种方法可以告诉.NET类型可能在多个程序集中,这是正常的(考虑到它们实际上是同一个程序集中,但在某种情况下只是与另一个程序集合并)?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Alex    15 年前

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

        2
  •  2
  •   Lucero    15 年前

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

    您可能需要添加对二进制“客户机”输出(即合并文件)的引用,并添加手动生成依赖项以控制正确的编译顺序。

    在我的一个项目中,我通过手动编辑csproj文件来做到这一点,将“copyfilestooutputdirectory”目标重写为不仅编译,而且在构建过程中合并“client”,而构建后事件也应该做到这一点(我同时做了一些其他不相关的更改,这迫使我更改了目标行为)。

    然后,我编辑了引用合并的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
  •  0
  •   Brian    15 年前

    好吧,你可以使用一个定制版本的illink(而不是ilmerge)来解决这个问题。

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

    见 Source Code here . 注意,ILink是一个C++程序。

    推荐文章