2

我有一个包含 10 个项目的解决方案。许多项目依赖于第三方 DLL,称为foo.dll.

问题是,当我升级 foo 时,在 Visual Studio 中,当我转到对象浏览器时,它会显示两个版本的foo.dll.

如何找出哪个项目引用了旧版本的 foo.dll,以便我可以升级它,以便所有项目中只有一个依赖项?

4

5 回答 5

3

这是你只想做一次的事情。

我给你的建议是买记事本。是的,记事本。

打开每个项目的 .csproj 文件。

XML 中将有一个部分概述正在引用的 DLL,包括路径等。即使它们来自 GAC,.NET 链接器使用的版本等也将包含在文件中. 引用的整行必须完全匹配。

将这些与您知道正确的一个项目进行比较。

在 .NET 中处理引用是其中最糟糕的部分之一。欢迎来到 DLL 地狱 v2.0 :(

于 2009-01-26T01:43:30.223 回答
0

听起来您在 GAC 中安装了两个版本的 Foo.dll。查看gacutil以删除旧的。

如果它只是一个文件引用,那么在每个项目中,打开“引用”并右键单击“Foo”并选择属性。它会在生成的属性窗口中告诉您版本等信息。

通常,解决此类依赖关系的最佳方法是在项目级别(但不是实际解决方案的一部分)有一个名为“依赖关系”的单独文件夹,其中包含这些类型的 DLL。

我还会考虑在您的服务器上进行一些构建自动化(TFS = Team Build、SVN = Cruise Control 等),这将在构建之前将正确版本的程序集复制到 bin 文件夹中。

有很多方法可以使用程序集,很容易混淆各种应用程序正在使用哪一种。值得花一些时间以可应用于所有未来项目的可模板方式解决此问题。

于 2009-01-26T01:43:09.007 回答
0

我理解这个问题,但我不确定你问的是正确的问题。让我解释一下 .NET 如何选择引用的程序集。

  • 装配参考可以是浮动的或固定的(右键单击项目参考文件夹中的装配,选择属性,查找“特定版本”)。如果版本是浮动的,.NET 将找到并使用最新的版本。“固定”参考版本是有意义的,这样可以避免您描述的问题(即安装产品的新版本不会破坏您的应用程序)。

  • 程序集可以位于全局程序集缓存中,也可以仅位于文件系统中。您应该选择一种方法并在整个项目中始终如一地使用它,这样您至少知道在哪里寻找。

如果你了解了这两个方面,你应该没有问题(好吧,至少你应该知道如果有问题应该怎么做)。如果您固定版本并升级,您必须打开您的 10 个项目并升级参考 - 但您与意外升级隔离。

如果您让您的版本浮动,所有引用将自动选择已安装的最新版本。如果将程序集放在 GAC 中,则不必在搜索路径和文件系统中搜索剩余的部分和 DLL 文件的意外副本。

于 2009-01-26T02:09:04.680 回答
0

我认为最好的答案是在可行的情况下只有一个项目具有这种依赖性。它使您可以在一个地方处理它。

如果这意味着项目需要包含一个可笑的围绕 DLL 的包装库,那么这可能不是最好的方法。但至少考虑一下。

于 2010-06-11T13:52:52.690 回答
0

我有同样的问题。

项目A引用了项目B。项目C引用了项目D,它引用了项目B。这导致项目C有一个对项目B的引用。我摆脱了项目D并清理了项目C(在代码中),但是对项目 B 仍然存在,我猜它是指向项目 D 的 bin 文件夹的二进制引用。

我在 Visual Studio 中更新了 Project B。当我作为启动项目 C 运行时,它抛出了这个错误。

为了解决这个问题,我进入了 Project C 的引用并删除了未使用的引用。

顺便说一句,您的实际问题 - 如何找出有问题的 dll 所在的位置 - 可以更容易地回答如下: 1. 进入资源管理器(此处为 Window 7 说明),并在整个代码文件夹中搜索 .dll . 2. 在资源管理器中为 FileVersion 添加列并按此列排序。瞧!

于 2012-02-24T18:50:06.313 回答