Visual Studio выбрасывает "неправильное" время исключения компиляции
Чтобы развернуть мой проект в Mono, я понизил его до .Net 4.0, как я уже делал, с библиотекой, на которую я ссылаюсь (CommonUtils). Тем не менее, я все еще получаю следующее исключение:
Основная ссылка "CommonUtils" не может быть решена, поскольку она имеет косвенную зависимость от сборки "Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed", которая была построена против ".NETFramework, Версия = v4.5". Это более высокая версия, чем текущая целевая среда ".NETFramework, Version = v4.0".
Что я пытался решить проблему:
- Я обновил все пакеты Nuget в обоих проектах
- Я несколько раз пытался очистить проекты/решения, удалить всю папку bin/obj, перестроить все
- Я изменил имя сборки, чтобы убедиться, что ничего не кэшировано
Ничего из этого не помогло.
Оба проекта должны быть скомпилированы как .Net 4.0. Ссылка заключается в копировании скомпилированной сборки CommonUtils в папку "ExternalLibraries", поскольку эта DLL также используется в других проектах.
Щелкните правой кнопкой мыши на Newtonsoft.Json.dll - который перемещается в папку bin
вместе с CommonUtils - отображается в описании деталей/файлов: Json.NET .NET 4.0
Я уверен, что у меня все правильно для .net 4.0, а Visual Studio также позволяет мне добавлять библиотеку и поддерживает меня с автозавершением, просто компиляция выдает указанное предупреждение. В результате предупреждения неожиданно появляется исключение, что ни один из типов, на которые ссылается CommonUtils, не существует
Не удалось найти тип имени пространства имен "CommonUtils" (вам не хватает директивы using или ссылки на сборку?)
Что еще я могу попытаться сделать этой работой?
PS: У меня была аналогичная проблема несколько лет назад, когда старая сборка использовалась для компиляции и "решала" ее, буквально настраивая окна и визуальную студию с нуля, но мне просто не хочется делать это время.
Update:
Он работает на другом компьютере: я взял структуру папок через USB Stick на другой компьютер с той же ОС (Windows 8.1) и той же Visual Studio 2013 - насколько я могу судить, оба компьютера должны иметь все обновления установлены - и там он работает.
Взятие USB-накопителя с успешно скомпилированным проектом обратно на мой компьютер - я все равно получаю те же ошибки.
(Я понимаю, это означает, что оба компьютера не могут иметь все одинаковое установленное, но я не знаю, как найти разницу, может быть, какой-то намек на то, что может быть так неправильно?)
Обновление 2:
Process explorer не помог слишком много, но когда я скомпилировал все с помощью диагностического журнала, я думаю, что получил ключевой намек:
...
5> Unified primary reference "Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed". (TaskId:158)
5> Using this version instead of original version "4.5.0.0" in "C:\<SolutionFolder>\packages\WebGrease.1.6.0\lib\WebGrease.dll" because of a binding redirect entry in the file "Web.config". (TaskId:158)
5> Using this version instead of original version "4.5.0.0" in "C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Http.dll" because of a binding redirect entry in the file "Web.config". (TaskId:158)
5> Using this version instead of original version "4.5.0.0" in "C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Net.Http.Formatting.dll" because of a binding redirect entry in the file "Web.config". (TaskId:158)
5> Resolved file path is "C:\<SolutionFolder>\packages\Newtonsoft.Json.6.0.3\lib\net40\Newtonsoft.Json.dll". (TaskId:158)
5> Reference found at search path location "{HintPathFromItem}". (TaskId:158)
5> Found related file "C:\<SolutionFolder>\packages\Newtonsoft.Json.6.0.3\lib\net40\Newtonsoft.Json.xml". (TaskId:158)
5> The ImageRuntimeVersion for this reference is "v4.0.30319". (TaskId:158)
...
Однако я получаю то же сообщение на другом компьютере, где работает сборка.
Кроме того, оба компьютера показывают эту строку в начале:
Skipping NuGet package Newtonsoft.Json 6.0.3 since it is already installed.
Что означает installed
в этом контексте? что NuGet скачал? или это где-то в GAC, но я не мог найти его? (см. комментарии)
И на машине, где работает компиляция, я получаю дополнительно этот вывод:
1> Dependency "Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed". (TaskId:17)
1> Resolved file path is "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Blend\Newtonsoft.Json.dll". (TaskId:17)
1> Reference found at search path location "{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}". (TaskId:17)
1> For SearchPath "C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies". (TaskId:17)
1> Considered "C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\Newtonsoft.Json.winmd", but it didn't exist. (TaskId:17)
1> Considered "C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\Newtonsoft.Json.dll", but it didn't exist. (TaskId:17)
1> Considered "C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\Newtonsoft.Json.exe", but it didn't exist. (TaskId:17)
1> For SearchPath "{TargetFrameworkDirectory}". (TaskId:17)
1> Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Newtonsoft.Json.winmd", but it didn't exist. (TaskId:17)
1> Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Newtonsoft.Json.dll", but it didn't exist. (TaskId:17)
1> Considered "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Newtonsoft.Json.exe", but it didn't exist. (TaskId:17)
1> For SearchPath "{Registry:Software\Microsoft\.NETFramework,v4.0,AssemblyFoldersEx}". (TaskId:17)
1> Considered AssemblyFoldersEx locations. (TaskId:17)
1> Required by "CommonUtils". (TaskId:17)
1> The ImageRuntimeVersion for this reference is "v4.0.30319". (TaskId:17)
Но я не вижу его на своем компьютере, где сбой компиляции
Окончательное обновление:
Я сдал и переустановил всю свою систему - теперь он работает, но не отвечает на вопрос, откуда появился неправильный Newtonsoft.Json.dll и почему он не появился в GAC, я могу, наконец, снова работать над этим проектом.
Я действительно разочарован, что это не так просто, как в maven, где вы можете просто удалить одну папку, чтобы maven обновил все библиотеки.
У меня есть изображение разбитой системы на VHD, поэтому, если кто-то еще придумает отличное решение, я могу попробовать его на виртуальной машине.
Ответы
Ответ 1
У меня была та же проблема, и решение заключалось в том, чтобы удалить Newtonsoft.json.dll
, расположенный в c:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\ref
Это описано как обходной путь в этом Сообщении об ошибке отчета.
Изменить: Исходный отчет об ошибке удален, возможно новая/связанная/такая же проблема: https://connect.microsoft.com/VisualStudio/feedback/details/816985
Ответ 2
Я сдал и переустановил всю свою систему - теперь он работает, но не отвечает на вопрос, откуда появился неправильный Newtonsoft.Json.dll и почему он не появился в GAC, я могу, наконец, снова работать над этим проектом.
Ответ 3
В VS 2013 существует ошибка для веб-проектов, где есть ссылка на устаревшую версию Newtonsoft.Json 4.5.0, оставшуюся в .csproj из шаблона проекта по умолчанию, который необходимо удалить вручную. Может, это проблема? У меня была аналогичная проблема на моем сайте, за исключением того, что у меня было предупреждение о конфликтующих версиях, поскольку у меня также была ссылка на более новую версию Newtonsoft.Json в том же проекте, добавленном из NuGet. Мне пришлось вручную выгрузить проект и удалить его чтобы предупреждение не появлялось.