两个不同项目中相同dll的两个版本

11

我有一个包含多个项目的解决方案。我需要在两个不同的项目中引用同一程序集的不同版本。目前的情况是只有最新版本的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?


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

4
是的,您可以使每个项目引用特定版本的相同dll。我建议将dll的两个版本都放入GAC中。在您的引用项目中,将Copy Local = false和Specific Version = true设置为false。
您可以通过使用配置文件和assembly binding directives(因为共享的dll不能在同一文件夹中,因为它们具有相同的名称)而不使用GAC来完成此操作,但这是GAC设计的主要问题之一。所以我建议利用它。

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

0

根据你的受众群体(如果这是一个服务器应用程序、网站、单用户桌面应用程序、多用户桌面应用程序等),你可以稍微作弊,将一个版本托管在完全独立的应用程序域中,比如 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

1
@Alex 这个问题没有明确应用程序的受众是谁 - 如果它是一个Web应用程序,并且他们有能力添加WCF服务,那么这个解决方案将起作用 - 我曾经因为这个确切的原因而不得不这样做。您可能需要调整一些类,可能生成一些服务包装器,但绝对是一个潜在的解决方案,通过将需要一个版本的代码保留在服务领域中,需要另一个版本的代码保留在Web应用程序领域中。根据情况,GAC可能更好,但这只是另一种选择。 - Joe Enos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接