1

我们有一个网站,使用在 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 如何处理这一切的任何指针?

我在这里这里看了几个线程,但没有运气。

4

2 回答 2

1

I remember that there is a distinct order of precedence going on with .net libraries.

I dug up this Stackoverflow post that might help your understanding: In what order are locations searched to load referenced DLLs?

In your particular case, might it help if you recompiled your site to use a specific version of the library? (Presumably you're not doing this at the moment?)

Or alternatively you could experiment by putting your version in the GAC as well?

Hope these give you some ideas.

于 2013-05-10T21:04:23.977 回答
1

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

于 2013-05-31T21:50:00.770 回答