【问题标题】:Two versions of the same dll in different projects不同项目中同一个dll的两个版本
【发布时间】:2013-07-30 18:11:13
【问题描述】:

我有一个包含多个项目的解决方案。我需要在两个不同的项目中引用同一程序集的不同版本。到目前为止,正在发生的事情是只有最新版本的 dll 被复制到 bin 文件夹中。所以依赖旧版本的dll失败并报错

Could not load file or assembly xxxx or one of its dependencies.
The located assembly's manifest definition does not match the 
assembly reference.

有没有办法让应用程序使用基于项目的特定版本的dll?

【问题讨论】:

  • 欢迎来到 dll 地狱
  • 请提供更多信息,说明哪个可执行文件需要哪个版本的哪个dll。它们都在同一个目录中吗?你可以使用 regasm 和程序集缓存吗?一个小例子或图表将有助于您解决这个问题。

标签: .net


【解决方案1】:

是的,您可以让每个项目引用同一个 dll 的特定版本。我建议将两个版本的 dll 都放在 GAC 中。在您的参考项目中,设置 Copy Local = false 和 Specific Version = true。

您可以在没有 GAC 的情况下使用您的配置文件和 assembly binding directives(因为共享的 dll 不能在同一个文件夹中,因为它们具有相同的名称)但这是 GAC 的主要问题之一旨在解决。所以我建议利用它。

【讨论】:

  • 应该提到的是,只有当程序集具有强名称(= 已签名)时,GAC 才是正确的解决方案。
  • @developer747:澄清一下,我说的是像 Probing (msdn.microsoft.com/en-us/library/4191fzwb.aspx) 这样的配置指令。我不是在谈论使用 bindingRedirect,因为这实际上并不能解决您的问题。 bindingRedirect 会导致您的两个程序集使用相同版本的共享 dll,而不是您声明需要的不同版本。
  • msdn.microsoft.com/en-us/library/eftw1fys%28v=vs.100%29.aspx 实际上解决了我的问题。它按预期工作。
  • @developer747:这意味着您的两个项目都将使用相同的 dll。如果这就是你想要的,为什么不把它们都指向同一个 dll 开始呢?听起来您是在说您需要两个项目来引用同一个 dll 的两个不同版本,但在运行时它们都可以使用相同版本的 dll 运行。
  • 项目 B 是共享项目。根据上图,项目 B 引用了我不想在当前解决方案中使用的 dll。同时我不想修改项目 B 中的引用,因为它正在被其他解决方案中的其他项目使用。使用配置设置,我告诉应用程序,即使存在此 dll 的多个版本,也请使用此版本。
【解决方案2】:

根据您的受众(如果这是一个服务器应用程序、网站、单个用户的桌面应用程序、多个用户的桌面应用程序等),您可能会作弊并在一个完全独立的版本中托管一个版本app 域,例如 Web 服务或 WCF 服务。

例如,假设您的项目是一个 Web 应用程序:

MyWebApplication
    - DLL reference to MyLibrary v1.0
    - Only have internal references which use v1.0 of the library
    - WCF proxy to http://localhost/MyWebService

MyWebService
    - DLL reference to MyLibrary v2.0
    - Only have internal references which use v2.0 of the library

【讨论】:

  • @Alex 这个问题没有区分应用程序的受众是什么——如果它是一个 Web 应用程序,并且他们能够添加 WCF 服务,那么这个解决方案将起作用——我出于这个确切原因,我不得不这样做一次。您可能需要改组一些类,可能会生成一些服务包装器,但这绝对是一个潜在的解决方案,通过将需要一个版本的代码保留在服务域中,而将需要另一个版本的代码保留在服务域中网络应用程序。根据具体情况,GAC 可能会更好,但这只是另一种选择。
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多