代码之家  ›  专栏  ›  技术社区  ›  Mr Shoubs

项目引用dll版本hell

  •  19
  • Mr Shoubs  · 技术社区  · 16 年前

    我们在让visual studio从我们的一个项目中获取dll的最新版本时遇到问题。

    我们有多个类库项目(如businesslogic、reportdata)和许多web服务,每个都有一个对我们编写的连接dll的引用(这个对连接dll的引用就是问题所在)。

    我们总是将引用指向bin/debug文件夹中的dll(这是我们为任何给定项目构建的目标),并且所有自定义dll引用都具有copyLocal=true和specificversion=false

    reportdata引用了业务逻辑(它也引用了连接性——我不明白为什么这会导致问题,但我认为值得一提)

    奇怪的是,当您单击“添加引用”并浏览到connectivity/bin/debug时-将鼠标悬停在dll文件上,会显示正确的(最新的)版本(版本和文件版本总是一起递增),但是当您单击“确定”时,会提取以前的版本号。即使我在当前的projects debug文件夹(copy local将在编译后放置dll)中查找显示最新版本号的文件。-在visual studio之外的任何地方都找不到dll的早期版本,但在该项目中,它引用的是旧版本,即使路径是正确的。

    我不知道从哪里得到旧版本。或者它为什么想要那个。

    这可能是我遇到过的最麻烦的问题。

    是否有人知道如何确保最新的版本通过(最好是自动或编译)。

    编辑:

    虽然不是我正在处理的那个场景 this 文章及其提到的CLR忽略修订号的地方。可以理解(尽管这以前不是问题-我们正在修订39),所以我想我会更新版本号,仍然没有工作。我想我会更新次要版本号,看看是否有什么不同。

    我不是说这是答案,因为我必须先检查很多东西,但表面上看,这似乎解决了我的问题…

    进一步编辑: 在其他类库中,这似乎解决了问题,但是在测试Windows应用程序中,它仍然会通过以下操作来获取以前的版本:(

    如果我再次增加次要版本号,同样的问题会再次出现,但我留下了错误的版本。

    进一步编辑-我创建了一个全新的项目,添加了一个引用,但仍然有同样的问题。这表明这个问题被限制在我正在引用的项目中。但愿我知道原因!

    以前有人遇到过这个问题,知道怎么解决吗?

    救命!

    11 回复  |  直到 9 年前
        1
  •  37
  •   Darin Dimitrov    16 年前

    避免 动态链接库地狱 我建议你创建一个 lib 文件夹,并将所有共享程序集放在此文件夹中。下一步,只添加此文件夹中的引用。这样,您的项目是自包含的,并且您知道它从何处选择引用。如果要用较新版本更新程序集,请将其复制到 国际清算银行 文件夹并重新生成项目。

    还要确保不要将引用的程序集放入gac中,因为它们可能会首先被拾取。

        2
  •  8
  •   sankar    16 年前

    你可以尝试的选择很少。

    1. 编译项目并在“输出”窗口中查看,以确切地验证引用该项目的程序集路径。
    2. 在重新编译obj文件夹之前删除它。
    3. 关闭并重新打开visual studio,因为vs有一些奇怪的行为来保持缓存以保存dll引用。
    4. 如果仍然看到问题,请使用此工具检查引用程序集的真正来源。 Process Explorer .
        3
  •  8
  •   Mr Shoubs    12 年前

    为了克服这个问题,我删除了所有引用,然后重新添加它们。我不知道为什么这是解决办法。

    在一个项目中,可能有一个dll不正确,正是这个不正确的dll被visual studio拖入并使用。

    编辑: 发生此错误的其他时间是由于当前项目中引用的ddl(a)也被另一个dll(b)引用。不重建另一个dll(b)似乎会阻止vs在当前项目中引用dll(a)的正确版本,从而导致使用较旧版本的dll(a)。

        4
  •  2
  •   Rowland Shaw    16 年前

    是否尝试将引用添加为项目引用?即添加引用…->项目选项卡->选择项目

        5
  •  2
  •   Captain Kenpachi    14 年前

    我们(作为团队中唯一的.NET开发人员,我的意思是我)也遇到了同样的问题。我把它追溯到一个被引用的dll,它又引用了遭受版本控制的dll。似乎是因为我没有更新所有 反过来 引用dll时,它在生成过程中的某个时刻被旧版本替换。

    我遇到的一个症状是,当我在代码编辑器中时,我添加到引用项目中的新类将被适当地着色,但是当我点击build时,它将变回黑色,并且我得到一条消息,说该类不存在(以及一个非常讽刺的“ar you missing an程序集引用?”)。这使我相信问题必须在构建阶段发生。

    因此,我建议构建任何其他指向此dll的项目,并重新添加它们的引用。

        6
  •  1
  •   lm28912    16 年前

    wpftoolkit也遇到了类似的问题。我们刚刚升级到2010年2月的版本(使用3月5日的msi)。“添加引用”会在正确的位置显示正确的文件,但会列出旧版本。但是,物理文件具有正确的版本。已从注册表中卸载、手动删除任何wpftoolkit引用,等等,但都无效。它一定是把这些东西藏在某个地方了,但我们还没搞清楚。在这上面浪费时间。

        7
  •  0
  •   smirkingman    14 年前

    启用fusionlog,在加载dll失败后,打开文件夹c:\ fusionlog\default\devenv.exe中具有dll名称的文件。这将显示实际加载dll的路径。

    在我看来,一个旧版本神秘地出现在

    C:\程序文件\Microsoft Visual Studio 10\Common7\IDE!

    为了防止这种情况再次发生,我在Common7 IDE上为每个人添加了一个安全规则“拒绝写入”。

        8
  •  0
  •   Mario Levesque    13 年前

    我有一个类似于这里所描述的问题,只是我的问题解决方案与我如何编译代码有关。构建、清理和重建之间有区别。在我的例子中,我只是在我的更改和依赖解决方案中的dll之间使用一个构建,而不是将所有更改都带到设置了引用的另一个解决方案中。我通过使用rebuild解决了这个问题,rebuild可以清除、编译和链接所有源文件,而不管它们是否更改。然后,第一个解决方案中的dll被更新并自动复制到第二个解决方案中,在第二个解决方案中设置了引用并解决了问题。 干杯,我希望这有帮助。

        9
  •  0
  •   Community Mohan Dere    9 年前

    类似的症状-问题出现在项目属性reference的“reference path”中。

    完整说明和解决方案如下: Referenced assemblies automatically replaced by visual studio Visual Studio/22810867 22810867

        10
  •  0
  •   Ranjan Shrestha    11 年前

    看看这些:

    1. 如果有问题的dll被宿主web应用程序及其引用的dll同时引用。例如,您的web应用程序使用abc.dll(有问题)和1个其他dll xyz.dll(即类项目也引用abc.dll)。

    在本例中,假设您已将abc.dll从版本1更新到版本2,并在Web应用程序中重新引用。但是,在生成过程中,abc.dll的版本2将更改回版本1,因为xyz.dll使用版本1,而web应用程序在xyz.dll的自动更新期间将abc.dll版本2重写回abc.dll版本1。

    解决方案:将abc.dll版本2的更新版本也放在xyz.dll的类项目bin中

    希望以上细节能有所帮助,祝你好运

        11
  •  0
  •   davidtj    9 年前

    一个可能的原因是引用路径。如果有任何对旧dll文件夹的引用,vs将使用它作为主引用,即使您添加了新的dll引用。

    推荐文章