我正在使用 Nuget v 2.8.50313.46 运行 VS2013 更新 1
您可以跳到这是重要的一点,以及最近的一些更新,然后返回以供引用。
我有一个 VS 解决方案,这是它的简化表示。
-- Solution
- Base (Class Library)
Packages:
No Packages Installed.
References:
System
System.Configuration
System.Core
System.Runtime.Caching
System.Web
- AppBase (Class Library)
Packages:
No Packages Installed.
References:
System
System.Core
System.Web.Http
Base
- Client (Console Application)
Packages:
EntityFramework v6.1.0
HtmlAgilityPack v1.4.6
References:
EntityFramework
EntityFramework.SqlServer
HtmlAgilityPack
System
System.Core
AppBase
Base
- Server (Web Application)
Packages:
HtmlAgilityPack v1.4.6
Microsoft.AspNet.WebApi v5.1.2
Microsoft.AspNet.WebApi.Client v5.1.2
(dependent on > Newtonsoft.Json v4.5.0)
Microsoft.AspNet.WebApi.Web... v5.1.2
Newtonsoft.Json v6.0.3
References:
HtmlAgilityPack
Newtonsoft.Json
System
System.Net.Http
System.Net.Http.Formatting
System.Web
System.Web.Http
System.Web.HttpHost
AppBase
Base
Server
中的代码需要 Newtonsoft.Json v6.0.3
才能运行。
当我重建所有并运行时,一切正常,如预期的那样。
我随后只构建了 AppBase
,没有构建 Server
。 AppBase
仅依赖于 Base
。
正如预期的那样,AppBase
和 Base
的二进制文件是“最新的”。
但是,
这是重要的一点,
AppBase
的构建导致“Server\bin”文件夹中的Newtonsoft.Json.dll
被替换为早期的 4.5 版本。
当我向 Server
发出请求时,由于 Newtonsoft.Json
dll 版本不正确导致的绑定(bind)错误,返回了“500 Intrernal Server Error”。
为什么构建程序集会影响非依赖程序集?
有没有人遇到过这种情况?
解决此问题的最佳方法是什么?
编辑 2014 年 6 月 19 日
我制作了一个新的解决方案文件,起初我认为这已经解决了问题。
但是问题已经转移到 System.Net.Http.Formatting.dll
:-S
如果我编辑 AppBase
,使其不引用 System.Web.Http
,效果就会消失。
也许这与 Program Files 中的 MVC 内容有关? ...
编辑 2014 年 6 月 20 日
我发布了 community wiki answer详细说明了我是如何解决这个问题的。我想有人可能会觉得它有用。但是,当我仅构建 AppBase
和 Base
时,解决方法并未解释影响 Server
的机制。这听起来像是一个错误,似乎是错误的吗?
最佳答案
AppBase
中对 System.Web.Http
的引用指向
C:\Program Files(x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Http.dll
我添加了我的最新
Microsoft.AspNet.WepApi.Core 5.1.2
打包到 AppBase
,如 Server
中所用。这引入了依赖包,
Microsoft.AspNet.WebApi.Client 5.1.2 Newtonsoft.Json 6.0.3 (the only version in my package source)
AppBase
中的 System.Web.Http
引用现在指向,
MySolutionFolder\packages\Microsoft.AspNet.WebApi.Core.5.1.2\lib\net45\System.Web.Http.dll
当我现在构建 AppBase
时,Server
中的 WepApi DLL 不再更改为旧版本。
顺便说一下,
此包更改在解决方案的项目中添加了多个 (a|A)pp.config
文件,所有文件都绑定(bind)重定向到最新版本的 Newtonsoft.Json
。
注意
我实际上认为这是一种变通方法,但我很高兴找到它。
AppBase
中的代码实际上并不需要最新的System.Web.Http.dll
。
我仍然不知道为什么构建 AppBase
会影响 Server
,这是一个错误吗?
将有问题的 DLL 标记为只读并不能保护它们。确实更改了安全权限,但在构建 AppBase
期间没有记录错误,即使使用诊断构建日志也是如此。
关于c# - 新的 DLL hell ;绑定(bind)了错误的程序集版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24309315/