我有一个包含 10 个项目的解决方案。许多项目依赖于第三方 DLL,称为foo.dll.
问题是,当我升级 foo 时,在 Visual Studio 中,当我转到对象浏览器时,它会显示两个版本的foo.dll.
如何找出哪个项目引用了旧版本的 foo.dll,以便我可以升级它,以便所有项目中只有一个依赖项?
我有一个包含 10 个项目的解决方案。许多项目依赖于第三方 DLL,称为foo.dll.
问题是,当我升级 foo 时,在 Visual Studio 中,当我转到对象浏览器时,它会显示两个版本的foo.dll.
如何找出哪个项目引用了旧版本的 foo.dll,以便我可以升级它,以便所有项目中只有一个依赖项?
这是你只想做一次的事情。
我给你的建议是买记事本。是的,记事本。
打开每个项目的 .csproj 文件。
XML 中将有一个部分概述正在引用的 DLL,包括路径等。即使它们来自 GAC,.NET 链接器使用的版本等也将包含在文件中. 引用的整行必须完全匹配。
将这些与您知道正确的一个项目进行比较。
在 .NET 中处理引用是其中最糟糕的部分之一。欢迎来到 DLL 地狱 v2.0 :(
听起来您在 GAC 中安装了两个版本的 Foo.dll。查看gacutil以删除旧的。
如果它只是一个文件引用,那么在每个项目中,打开“引用”并右键单击“Foo”并选择属性。它会在生成的属性窗口中告诉您版本等信息。
通常,解决此类依赖关系的最佳方法是在项目级别(但不是实际解决方案的一部分)有一个名为“依赖关系”的单独文件夹,其中包含这些类型的 DLL。
我还会考虑在您的服务器上进行一些构建自动化(TFS = Team Build、SVN = Cruise Control 等),这将在构建之前将正确版本的程序集复制到 bin 文件夹中。
有很多方法可以使用程序集,很容易混淆各种应用程序正在使用哪一种。值得花一些时间以可应用于所有未来项目的可模板方式解决此问题。
我理解这个问题,但我不确定你问的是正确的问题。让我解释一下 .NET 如何选择引用的程序集。
装配参考可以是浮动的或固定的(右键单击项目参考文件夹中的装配,选择属性,查找“特定版本”)。如果版本是浮动的,.NET 将找到并使用最新的版本。“固定”参考版本是有意义的,这样可以避免您描述的问题(即安装产品的新版本不会破坏您的应用程序)。
程序集可以位于全局程序集缓存中,也可以仅位于文件系统中。您应该选择一种方法并在整个项目中始终如一地使用它,这样您至少知道在哪里寻找。
如果你了解了这两个方面,你应该没有问题(好吧,至少你应该知道如果有问题应该怎么做)。如果您固定版本并升级,您必须打开您的 10 个项目并升级参考 - 但您与意外升级隔离。
如果您让您的版本浮动,所有引用将自动选择已安装的最新版本。如果将程序集放在 GAC 中,则不必在搜索路径和文件系统中搜索剩余的部分和 DLL 文件的意外副本。
我认为最好的答案是在可行的情况下只有一个项目具有这种依赖性。它使您可以在一个地方处理它。
如果这意味着项目需要包含一个可笑的围绕 DLL 的包装库,那么这可能不是最好的方法。但至少考虑一下。
我有同样的问题。
项目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 添加列并按此列排序。瞧!