Новый DLL Hell; неверная версия сборки
Я запускаю обновление VS2013 1 с помощью Nuget v 2.8.50313.46
Вы можете перейти к , это важный бит, а также некоторые последние обновления и вернуться к ссылке.
У меня есть 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
вызывает замену Newtonsoft.Json.dll
в папке "Сервер\bin" для более ранней версии 4.5.
Когда я делаю запрос на Server
, возвращается ошибка "Внутренняя серверная ошибка 500" из-за ошибки привязки, вызванной неправильной версией Newtonsoft.Json
dll.
Почему построение сборки влияет на не зависимую сборку?
Кто-нибудь еще испытал это?
Каков наилучший способ решить эту проблему?
РЕДАКТИРОВАТЬ 19/06/2014
Я создал новый файл решения, сначала я решил, что это решило проблему.
Однако проблема была перенесена на System.Net.Http.Formatting.dll
: -S
Если я отредактирую AppBase
, поэтому он не ссылается на System.Web.Http
, эффект исчезнет.
Может быть, это что-то связано с материалом MVC в Program Files?...
РЕДАКТИРОВАТЬ 20/06/2014
Я опубликовал ответ сообщества wiki, в котором подробно описывается, как я работал над проблемой. Я думал, что кто-то может найти это полезным. Однако обходной путь не объясняет, какой механизм выполняет Server
, когда я строю только AppBase
и Base
. Это звучит как ошибка, кажется неправильной?
Ответы
Ответ 1
Ссылка на System.Web.Http
в AppBase
указывала на
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)
Ссылка System.Web.Http
в AppBase
теперь указывает на,
MySolutionFolder\пакеты\Microsoft.AspNet.WebApi.Core.5.1.2\Lib\net45\System.Web.Http.dll
Когда я создаю AppBase
сейчас, DLL WepApi в Server
больше не будет изменен на устаревшие версии.
Кстати,
Это изменение пакета добавляет несколько файлов (a|A)pp.config
в проекты решений, все с переадресацией привязки к последней версии Newtonsoft.Json
.
Примечание
Я действительно рассматриваю это как работу, хотя я рад найти.
Код AppBase
действительно не нуждается в последнем System.Web.Http.dll
.
Я до сих пор не знаю, почему создание AppBase
должно срабатывать Server
, это ошибка?
Маркировка проблемных библиотек DLL как только для чтения не защищала их. Изменение прав безопасности было выполнено, но при сборке AppBase
не регистрировалась ошибка, даже при записи журнала диагностики.
Ответ 2
Nuget устанавливает выбранный пакет и любые другие пакеты, от которых он зависит.
Очевидно, что в вашем решении сервера есть пакеты с использованием Newtonsoft.Json v4.5, поэтому Nuget копирует DLL в bin, возникает проблема.
Вы можете использовать переадресацию переадресации, как прокомментировал Jon Skeet, или вам следует использовать Newtonsoft.Json v4.5 в решении сервера.
Другим вариантом является extern alias для ссылки на две разные версии этой DLL.
Ответ 3
Я подозреваю, что проблема, с которой вы столкнулись, связана с кешем пакета вашего решения.
Попробуйте процедуру, как описано в ответе Джордана Уолтера, в этом сообщении