Подтвердить что ты не робот

Новый 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. Это звучит как ошибка, кажется неправильной?

4b9b3361

Ответ 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

Я подозреваю, что проблема, с которой вы столкнулись, связана с кешем пакета вашего решения.

Попробуйте процедуру, как описано в ответе Джордана Уолтера, в этом сообщении