【问题标题】:Solution with mulitple projects dependent on the same binary reference多个项目依赖于同一个二进制引用的解决方案
【发布时间】:2010-10-03 11:31:27
【问题描述】:
我有一个包含 10 个项目的解决方案。许多项目依赖于名为foo.dll 的第三方DLL。
问题是,当我升级 foo 时,不知何故在 Visual Studio 中,当我转到对象浏览器时,它向我显示了 foo.dll 的两个版本。
如何找出哪个项目引用了旧版本的 foo.dll,以便我可以升级它,这样所有项目中只有一个依赖项?
【问题讨论】:
标签:
c#
binary
dependencies
reference
projects-and-solutions
【解决方案1】:
这种事情你只想做一次。
我给你的建议是使用记事本。是的,记事本。
打开每个项目的 .csproj 文件。
XML 中将有一个部分概述正在引用的 DLL,包括路径等。即使它们来自 GAC,也会包括 .NET 链接器使用的版本等在文件中。引用的整行必须完全匹配。
将这些与您认为正确的项目进行比较。
在 .NET 中处理引用是其中最糟糕的部分之一。欢迎来到 DLL 地狱 v2.0 :(
【解决方案2】:
我认为最好的答案是在可行的情况下只有一个项目具有这种依赖关系。它让您可以在一个地方处理它。
如果这意味着项目需要包含一个可笑的围绕 DLL 的封装库,那么这可能不是最好的方法。但至少考虑一下。
【解决方案3】:
听起来您在 GAC 中安装了两个版本的 Foo.dll。
查看gacutil 删除旧的。
如果只是一个文件引用,那么在每个项目中,打开“References”并右键单击“Foo”并选择属性。它会在生成的属性窗口中告诉您版本等信息。
通常,处理此类依赖项的最佳方法是在项目级别(但不是实际解决方案的一部分)有一个名为“依赖项”的单独文件夹,其中包含这些类型的 DLL。
我还会考虑在您的服务器上进行一些构建自动化(TFS = Team Build、SVN = Cruise Control 等),这将在构建之前将正确版本的程序集复制到 bin 文件夹中。
有很多方法可以使用程序集,很容易混淆各种应用程序正在使用哪一种。值得花一些时间以可应用于所有未来项目的可模板方式解决此问题。
【解决方案4】:
我理解这个问题,但我不确定您提出的问题是否正确。让我解释一下 .NET 如何选择引用的程序集。
如果你理解了这两个方面,你应该不会有问题(好吧,至少你应该知道如果有问题该怎么办)。如果您固定版本并升级,您必须打开您的 10 个项目并升级参考 - 但您不会意外升级。
如果您让版本浮动,所有参考将自动选择安装的最新版本。如果您将程序集放在 GAC 中,则不必在搜索路径和文件系统中搜索剩余部分和 DLL 文件的意外副本。
【解决方案5】:
我遇到了同样的问题。
项目 A 引用了项目 B。
项目 C 引用了项目 D,项目 D 又引用了项目 B。
这导致项目 C 引用了项目 B。
我摆脱了项目 D 并清理了项目 C(在代码中),
但是对项目 B 的引用仍然存在,我猜是指向项目 D 的 bin 文件夹的二进制引用。
我在 Visual Studio 中更新了项目 B。
当我作为启动项目 C 运行时,它抛出了这个错误。
为了修复,我进入了项目 C 的引用并删除了未使用的引用。
顺便说一句,您的实际问题 - 如何找出有问题的 dll 所在的位置 - 可以更容易地回答如下:
1. 进入资源管理器(此处为 Window 7 说明),并在整个代码文件夹中搜索 .dll。
2. 在资源管理器中为 FileVersion 添加列并按此列排序。瞧!