是什么原因导致IIS在4.0应用程序池中加载.NET 2.0 dll而不是4.0版本?

时间:2013-05-10 20:54:21

标签: asp.net-mvc iis json.net

我们有一个网站,使用在IIS 7上运行的最新MVC 4构建。我们创建了自己的应用程序池并将其运行时版本设置为4.0。在过去的几个月里,一切进展顺利。 昨天,我们升级到了最新的内部版本,包括该机器上所需的其他组件。其中一个组件将 Newtonsoft.Json.dll v4.5.10安装到 GAC 中,用于其中的几个组件。

这打破了我们的网站。我们做了一些快速挖掘,发现IIS(w3wp.exe)正在从GAC 加载 Newtownsoft.Json.dll而不是我们网站上的版本(4.5.11 - 用于.NET 4.0)。这很令人费解,因为我们将应用程序池设置为.NET Framework 4.0

什么会导致IIS从GAC而不是我们的本地版本加载此DLL?

任何方式强制它使用我们的本地副本?

他们很快就很有可能成为同一版本,但其中一个版本的目标是.NET v4.0而不是v2.0。 关于IIS如何处理这一切的任何指示?

我看了几个帖子herehere没有运气。

2 个答案:

答案 0 :(得分:1)

我记得.net库有一个独特的优先顺序。

我挖出了这篇可能有助于您理解的Stackoverflow帖子:In what order are locations searched to load referenced DLLs?

在您的特定情况下,如果您重新编译网站以使用特定版本的库,可能会有帮助吗? (想必你现在不这样做?)

或者您也可以通过将您的版本放入GAC进行试验?

希望这些能给你一些想法。

答案 1 :(得分:1)

据我所知,Newtonsoft.Json.dll具有与4.5版本相同的强名称,以及为(2.0,3.5和4.0)构建的所有不同.NET框架。这在Json.NET的4.0版本中并非如此,但正如您可以阅读here一样,版本控制策略从4.5开始改变。如果每个目标.NET Framework的程序集的强名称不同,那就太好了,但它们不是。因此,将Newtonsoft.Json.dll放入GAC似乎是一种犯罪行为。它很可能会破坏计算机上的其他应用程序,尤其是在应用程序构建在不同的.NET Framework版本上时。由于我需要将其添加到GAC,我自己构建并更改了强名称。