Visual Studio 2017 - Не удалось загрузить файл или сборку "System.Runtime, Version=4.1.0.0" или одну из ее зависимостей
Я использую Visual Studio 2017 и пытаюсь создать библиотеку.Net Standard 1.5 и использовать ее в тестовом проекте.Net 4.6.2 nUnit.
Я получаю следующую ошибку...
Не удалось загрузить файл или сборку 'System.Runtime, Version=4.1.0.0, Culture= нейтральный, PublicKeyToken=b03f5f7f11d50a3a' или одну из ее зависимостей. Система не может найти указанный файл.
Я пробовал следующее:
- Ссылка на стандартную библиотеку в качестве ссылки на проект Ошибка: дает мне предыдущую ошибку.
- Создать NuGet pkg для моей библиотеки Std и сослаться на это. Ошибка: тип System.String, ожидающий System.String. Это потому, что System.Runtime в итоге получил ссылку на проект, и у него есть определения для всех стандартных типов.
- Ссылка NuGet pkg NetStandard.Library. Ошибка: выдайте мне ту же ошибку, что и # ("Тип System.String, ожидающий System.String"). ПРИМЕЧАНИЕ. Перед этим я удалил ВСЕ пакеты NuGet из проекта, а затем добавил только пакеты nUnit и NetStandard.Library (которые установили 45 других пакетов).
Это ошибка? Есть ли обходной путь? Любая помощь приветствуется.
28 ответов
У меня была та же самая проблема, и никакие предложенные решения, которые я нашел, не работали. Мое решение для этой проблемы было: Проверьте App.config и packages.config, чтобы увидеть, совпадают ли версии.
Первоначально мой app.config содержал:
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
Но в файле packages.config содержится:
<package id="System.Runtime" version="4.3.0" targetFramework="net461" requireReinstallation="true" />
Я изменил запись app.config, чтобы она соответствовала packages.config для newVersion:
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.3.0" />
</dependentAssembly>
После изменения проблема была решена.
Я недавно столкнулся с этой проблемой, и я попробовал много вещей, упомянутых в этой теме и других. Я добавил ссылку на пакет для "System.Runtime"
с помощью менеджера пакетов nuget, исправлены ошибки app.config
и убедитесь, что app.config
а также package.config
есть такая же версия для сборки. Однако проблема осталась.
Наконец, я удалил <dependentAssembly>
тег для сборки и проблема исчезла. Итак, попробуйте удалить следующее в вашем app.config
,
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.1.0" />
</dependentAssembly>
Эта проблема возникает, когда вы ссылаетесь на проект.NET Standard из проекта.NET 4.x: ни одна из ссылок пакета nuget проекта.NET Standard не вводится как зависимости.
Чтобы это исправить, вам нужно убедиться, что файл.NET 4.x csproj указывает на текущие инструменты сборки (как минимум 14):
<Project ToolsVersion="15.0">...
Нижеследующее больше не нужно, это было исправлено около VS 15.3:
Была известная ошибка в VS2017, в частности в NuGet 4.0.
Чтобы обойти эту ошибку, вам нужно открыть файл.csproj для вашего проекта.NET 4.x и добавить этот фрагмент:
<ItemGroup>
<PackageReference Include="Legacy2CPSWorkaround" Version="1.0.0">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
</ItemGroup>
NuGet 4.x приносит с собой "ссылку на пакет" - больше нет ни одного package.config - но старый конвейер 4.x не был полностью обновлен во время запуска VS2017. Вышеприведенный фрагмент похоже "пробуждает" систему сборки, чтобы правильно включать ссылки на пакеты из зависимостей.
Поверь мне, я не шучу. Удалите все зависимости System.Runtime из вашего app.config, и он начнет работать.
Я исправил эту ошибку, сославшись на файл NetStandard.Library и следующий файл app.config в NUnit-Project.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
редактировать
Если что-то кроме System.Runtime
, System.Reflection
или же System.Runtime.InteropServices
отсутствует (например, System.Linq
), затем просто добавьте новый dependentAssembly
узел.
Редактировать 2
В новых версиях Visual Studio (я думаю, 2017 год, 15.8) Studio может создать файл app.config. Просто установите флажок Автоматически создавать перенаправления привязки в Project-Properties - Application.
Я исправил это, удалив мой app.config
с
<assemblyIdentity name="System.Runtime" ....>
записей.
app.config
был автоматически добавлен (но не нужен) во время рефакторинга
В app.config или web.config добавьте
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.0.0.0"/>
</dependentAssembly>
Похоже, проблема возникает из-за конфликта версий между packages.config и app.config. В app.config у вас есть перенаправления привязки сборки, автоматически генерируемые функцией AutoGenerateBindingRedirects. Если этот параметр включен каждый раз, когда вы загружаете пакет nuget, он будет, помимо создания новой записи в packages.config, добавлять эту информацию о перенаправлении привязки в app.config, какова цель этого объясняется здесь: Перенаправление привязки сборки: как и почему?
Там вы можете прочитать, что написал пользователь @Evk:
Зачем вообще нужны привязки перенаправления? Предположим, у вас есть приложение A, которое ссылается на библиотеку B, а также на библиотеку C версии 1.1.2.5. Библиотека B, в свою очередь, также ссылается на библиотеку C, но версии 1.1.1.0. Теперь у нас конфликт, потому что вы не можете загружать разные версии одной и той же сборки во время выполнения. Чтобы разрешить этот конфликт, вы можете использовать перенаправление привязки, обычно к новой версии
Итак, БЫСТРОЕ ИСПРАВЛЕНИЕ: удалите все записи в app.config.
В моем случае эта программа начала работать, но она, вероятно, будет работать только в том случае, если у вас нет конфликтов версий одной и той же сборки во время выполнения.
Если у вас есть такой конфликт, вы должны исправить эти номера версий в app.config, чтобы они соответствовали фактически используемым версиям сборок, но ручной процесс болезнен, поэтому я предлагаю автоматически сгенерировать их снова, открыв Консоль диспетчера пакетов и выполнить переустановку пакетов, набрав Update-Package -reinstall
Эта проблема имеет много причин... в моем случае проблема заключалась в том, что в моем файле web.config был добавлен тег System.Runtime:
<assemblies>
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</assemblies>
но один пакет также добавил ту же сборку, что и зависимость с другой версией:
<package id="System.Runtime" version="4.3.0" targetFramework="net47" />
удаление тега "добавить сборку" из моего web.config решило проблему.
Я знаю, что слишком поздно, но пока нет успешного ответа. Я нашел ответ на другом сайте. Я исправил проблему при удалении зависимости сборки System.Runtime. Я удалил это.
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
С уважением
Эта проблема возникает, когда вы ссылаетесь на проект.NET Standard из проекта.NET 4.x: ни одна из ссылок на пакет nuget для пакета.NET Standard не вводится как зависимости.
Я решил добавить System.Runtime 4.3
и NETStandard. Библиотека и пакет !! важно! Я использую инструмент рефакторинга для поиска версии System.Runtime.dll, это 4.1.1.1
не 4.3
и затем добавьте bindingRedirect в.config
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.1.1.1" />
</dependentAssembly>
Перед запуском модульных тестов просто удалите теги времени выполнения из файла app.config. Проблема будет решена.
Мы обнаружили, что AutoGenerateBindingRedirects
может быть причиной этой проблемы.
Наблюдаемый: тот же самый проект, нацеливающийся net45
а также netstandard1.5
был успешно собран на одной машине и не смог собрать на другой. На машинах были установлены разные версии фреймворка (4.6.1 - успех и 4.7.1 - сбой). После обновления фреймворка на первом компьютере до 4.7.1 сборка также не удалась.
Error Message:
System.IO.FileNotFoundException : Could not load file or assembly 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
----> System.IO.FileNotFoundException : Could not load file or assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
Auto binding redirects
это особенность .net 4.5.1
, Всякий раз, когда nuget обнаруживает, что проект транзитивно ссылается на разные версии одной и той же сборки, он автоматически создает файл конфигурации в выходном каталоге, перенаправляя все версии на самую высокую требуемую версию.
В нашем случае это была перепроверка всех версий System.Runtime
в Version=4.1.0.0
, .net 4.7.1
корабли с 4.3.0.0
версия времени выполнения. Таким образом, привязка перенаправления была привязана к версии, которая не была доступна в современной версии фреймворка.
Проблема была исправлена с отключением перенаправления автоматической привязки для цели 4.5 и оставлением только для ядра.net.
<PropertyGroup Condition="'$(TargetFramework)' == 'net45'">
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
</PropertyGroup>
В моем случае я просто удалил весь контент в
packages
папку в корневом каталоге решения.
Я пытался добавить ссылку на
.NET Core 3.1 Class Library
проект к решению, имеющему
ASP.NET 4.6.1
проект. Затем я начал получать ту же ошибку, за исключением версии:
Could not load file or assembly 'System.Runtime, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
.
У меня была проблема с этим в проекте NUnit 2.6.4, нацеленном на среду dotnet 4.6.2. Я столкнулся с этим System.Runtime FileNotFound
ошибка при попытке использовать Humanizer.
Я исправил свою ошибку, установив NetStandard.Library в мой проект модульного тестирования.
Впервые столкнулся с этим в проекте Unit Test после добавления MsTest V2 через Nuget. Переименование app.config (так эффективно удалив его) помогло мне.
Прочитав все вышеупомянутые посты, я до сих пор не уверен, почему, извините!
Я попробовал все решения здесь, но безрезультатно. В конце концов я решил эту проблему, открыв новый файл csproj и вручную добавив следующий раздел:
<Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<HintPath>..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
</Reference>
У меня был проект с той же проблемой, я решил ее, изменив версию ядра dotnet с 2.2 на 2.0. Если проблема осталась, попробуйте это решение.
Я несколько раз оказывался в этой ситуации с моим веб-сайтом.NET 4.6.1. Я создавал проблему каждый раз, когда добавлял ссылку на отдельный проект.NET Core. После сборки Visual Studio правильно предупредила меня, что такие межфреймовые ссылки недействительны, и я быстро удалил ссылку на проект. После этого проект работал нормально, но при доступе к веб-сайту возникла ошибка System.Runtime, и он отказался уходить.
Исправление каждый раз было неэффективным, но эффективным: я удалил каталог проекта и снова загрузил его из системы контроля версий. Несмотря на то, что не было никакой разницы между до и после, я смог построить проект и получить доступ к странице без жалоб.
Я исправил проблему, удалив пакет Nuget System.Runtime
а затем переустановить его
У меня была та же проблема с закрытием и повторным открытием проекта, которая устранила проблему для меня.
У меня была похожая проблема в VS 2017 15.45 - я обнаружил, когда проверил, что, хотя проект компилировался и запускался, он обнаружил исключение system.IO.FileNotFoundException в отношении System.Runtime при попытке доступа к объектам потока данных TPL.
Когда я проверял проекты в решении, в одном из них (верхнем) отсутствовал пакет System.Runtime, используемый базовыми проектами. Как только я установил его из Nuget, все заработало правильно.
Я использую ASP.Net CORE 2.1, и я получил эту ошибку, когда бежал, выбрав.csproj из списка около 40 в большом репо. Когда я открыл файл csproj по отдельности, ошибка была устранена. Что-то с тем, как была запущена программа, отличалось при открытии csproj.
Я решил эту проблему, переключившись с.NET 4.7.2 => .NET 4.5.2, а затем вернувшись к 472. Поэтому в некоторых случаях эта ошибка возникает из-за того, что диспетчер пакетов не может разрешить зависимости.
У меня возникла эта ошибка при создании функции Azure (с триггером очереди, если это имеет значение)
Проблема в этом случае заключалась в том, что AzureFunctionsVersion
был установлен на v2 вместо v3. Чтобы обновить его через VS2019, выгрузите проект и отредактируйте файл csproj. В рамкахPropertyGroup
node добавьте / отредактируйте следующее:
<PropertyGroup>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>
</PropertyGroup>
Если он работал ранее, то должно быть изменение App.config. У меня сработало Undo App.config.
Я также прошел через эту ошибку и рассказываю, как я избавился от нее.
В моем случае строка ниже существовала в web.config проекта webapi, но в файле package.config не было ссылки на пакет.
Код в Web.config в проекте Webapi
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="B03F5F7F11D50A3A" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.3.0" />
</dependentAssembly>
Код, который я добавил в файл packages.config в проекте веб-API Перед закрытием элемента.
<package id="System.Runtime" version="4.3.0" targetFramework="net461" />
В моем случае сработало другое решение:
Другой вариант Sure, который может сработать, если вы скопировали проект в другую компьютерную систему, которая может иметь немного разные версии пакетов, поэтому вы можете попробовать изменить версию сборки на версию, указанную по ошибке на веб-сайте / webapi при ее запуске. Как и в этом случае, как указано в вопросе, необходимая версия - '4.1.0.0', поэтому просто попробуйте изменить текущую версию в web.config на версию, показанную с ошибкой, как показано ниже
Ошибка:
Could not load file or assembly 'System.Runtime, Version=4.1.0.0' or one of its dependencies
Для меня это был отсутствующий файл web.config. После добавления его в каталог развернутого проекта в приложении asp net core 3.1 проблема была решена.