【问题标题】:DLL version mismatch: The located assembly's manifest definition does not match the assembly referenceDLL 版本不匹配:找到的程序集的清单定义与程序集引用不匹配
【发布时间】:2018-11-25 02:55:20
【问题描述】:

我在 Visual Studio 2003 中有一个旧项目,它是过去由其他开发人员制作的。

此项目添加了一些参考。其中之一,假设是 myDLL.dll。它在VS中具有以下属性:

  • 复制本地 = True
  • 运行时版本 v1.1.4322
  • 强名称:真
  • 类型:装配体
  • 版本:2.1.1.30200

我构建解决方案并将其复制到生产机器的目标路径中。 在target中我已经确保myDLL.dll和VS方案中的版本相同,即2.1.1.30200。

当我在生产机器上执行新版本的应用程序时,我的应用程序日志中会显示以下错误:

名称为“myDLL”的已定位程序集的清单定义不 匹配程序集引用。

我猜在 GAC 中加载/安装了此 DLL 的先前版本,因此出现上述异常。

所以,我想知道 GAC 是否会不时(定期)自动清理,还是我需要手动删除旧的 DLL 并安装新的?

如果我需要在生产机器上移除旧的并安装新的,我该怎么做?

此外,如果我在生产机器中转到 C:\Windows\assembly,我可以找到 DLL myDLL,但显示的版本是 2.1.0.0 而不是 2.1.x.x。为什么?不应该是2.1.1.30200(新的)还是2.1.1.20100(旧的)?

我在这里阅读了很多帖子,如下所示:

我发现的其他有趣的链接:

但我是 GAC 的新手。

【问题讨论】:

  • 使用fuslogvwProcess Monitor 找出实际加载的DLL 并告诉我们。
  • .csproj 文件中的参考资料如何?

标签: c# visual-studio gac visual-studio-2003


【解决方案1】:

您是否尝试将 myDLL.dll 放入您的输出程序所在的同一目录中?对于 web 项目,它是“bin”目录,对于 EXE,只需将它们放在同一个文件夹中即可。所以它将从应用程序目录加载,而不是从 GAC 加载。

【讨论】:

  • 这是一个旧版的 winform 应用程序。 DLL 位于可执行文件所在的同一目录中。我认为当应用程序启动并且需要将 DLL 加载到内存中时,它首先会去 GAC 以搜索它。如果在 GAC 中找不到 DLL,则它会转到应用程序目录并从那里加载 DLL 并将其放入 GAC。如果它在 GAC 中,则从那里加载并检查版本,如果版本不同,则会引发此错误。那我是不是很困惑?这样不行吗?
  • 如果它按照你说的从app目录加载DLL,并且app目录中的DLL版本是正确的,那为什么会抛出这种错误呢?
  • 错了。 GAC 中的文件优先于应用程序目录中的文件,请参阅docs.microsoft.com/en-us/dotnet/framework/deployment/…
  • @WernfriedDomscheit 正确,这就是我的理解。感谢您确认。
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多