我有10个项目的解决方案。许多项目依赖于名为foo.dll
的第三方DLL。
问题在于,当我升级foo时,在进入对象浏览器时以某种方式在Visual Studio中,它向我展示了两个版本的foo.dll
。
如何找出引用旧版本foo.dll的项目,以便我可以对其进行升级,以便所有项目只有一个依赖项?
答案 0 :(得分:3)
这是你只想做一次的事情。
我给你的建议是拿记事本。是的,记事本。
打开每个项目的.csproj文件。
XML中将有一个部分概述正在引用的DLL,包括路径等。即使它们是从GAC出来的,.NET链接器使用的版本等也将包含在内。在文件中。引用的整行必须完全匹配。
将这些与您认为正确的项目进行比较。
处理.NET中的引用是其中最糟糕的部分之一。欢迎来到DLL hell v2.0 :(
答案 1 :(得分:0)
听起来你在GAC中安装了两个版本的Foo.dll。 查看gacutil以删除旧版本。
如果它只是一个文件引用,那么在每个项目中,打开'References'并右键单击'Foo'并选择属性。它会在结果属性窗口中告诉您诸如版本之类的信息。
通常,像这样的依赖关系的最佳方法是在项目级别(但不是实际解决方案的一部分)中有一个单独的文件夹,称为“依赖关系”,其中包含这些类型的DLL。
我还会考虑服务器上的一些构建自动化(TFS = Team Build,SVN = Cruise Control等),它们会在构建之前将正确版本的程序集复制到bin文件夹中。
有许多方法可以使用程序集,并且很容易混淆各种应用程序正在使用哪一个。值得花一些时间以可模板化的方式解决这个问题,这可以应用于所有未来的项目。
答案 2 :(得分:0)
我理解这个问题,但我不确定你是在问正确的问题。让我解释.NET如何选择引用的程序集。
程序集引用可以是浮动的或固定的(右键单击项目的references文件夹中的程序集,选择Properties,查找“Specific Version”)。 如果版本是浮动的,.NET将查找并使用最新版本。 “引脚”引用版本是有意义的,这样可以避免您描述的问题(即安装新版本的产品不会破坏您的应用程序)。
程序集可以位于全局程序集缓存中,也可以位于文件系统中。您应该选择一种方法并在整个项目中一致地使用它,这样您至少知道在哪里看。
如果你理解这两个方面,你应该没有问题(好吧,至少你应该知道如果有问题该怎么办)。如果您固定版本并升级,则必须打开10个项目并升级参考 - 但您与实际升级是隔离的。
如果您的版本浮动,所有引用都将自动获取已安装的最新版本。如果将程序集放在GAC中,则不必在搜索路径和文件系统中搜索DLL文件的剩余部分和实际副本。
答案 3 :(得分:0)
我认为最好的答案是只有一个项目具有此依赖性才可行。它可以让你在一个地方处理它。
如果这意味着项目需要围绕DLL包含一个非常胖的包装库,这可能不是最好的方法。但至少要考虑它。
答案 4 :(得分:0)
我遇到了同样的问题。
项目A引用了项目B. 项目C引用了项目D,引用了项目B. 这导致项目C引用了项目B. 我摆脱了Project D并清理了Project C(在代码中), 但是对项目B的引用仍然存在,我想作为指向项目D的bin文件夹的二进制引用。
我在visual studio中更新了Project B. 当我作为启动项目C运行时,它抛出了这个错误。
为了解决这个问题,我参与了Project C并删除了未使用的引用。
顺便说一句,你的实际问题 - 如何找出有问题的dll所在的位置 - 可以更容易地像这样回答: 1.进入资源管理器(此处为Window 7说明),并在整个代码文件夹中搜索.dll。 2.在Explorer中为FileVersion添加列,并对此列进行排序。瞧!