Не удалось загрузить файл или сборку "System.ValueTuple"
У меня есть проект VS2017, который компилируется в DLL, который затем вызывается EXE, написанным кем-то другим. Оба проекта нацелены на .Net Framework 4.6.2. Я переписал один из моих DLL-методов, чтобы вернуть кортеж, а также импортировал связанный пакет NuGet. Когда я компилирую проект, он включает System.ValueTuple.dll в выходной каталог, который затем развертывается на других машинах, где моя DLL загружается и вызывается EXE. Но когда EXE пытается вызвать метод, возвращающий кортеж, он сбой:
Неожиданная ошибка Не удалось загрузить файл или сборку "System.ValueTuple, Version = 4.0.1.0, Culture = neutral, PublicKeyToken = cc7b13ffcd2ddd51" или одну из его зависимостей. Система не может найти указанный файл.
Я не понимаю, почему он не находит файл, так как он находится в той же папке, что и моя DLL. По-видимому, MS не включила эту сборку в .Net Framework 4.6.2.
Обратите внимание, что моя DLL зарегистрирована в Windows, используя файл machine.config. Я предполагаю, что если я также добавлю System.ValueTuple.dll в этот файл, он будет работать (еще не пробовал и не уверен, что это лучший подход, особенно долгосрочный.) Есть ли лучший способ, помимо ожидания 4.6.3 и надеется, что он включает эту сборку?
Ответы
Ответ 1
Я разрешил эту проблему, зарегистрировав System.ValueTuple в моем файле machine.config компьютера (вместе с моей собственной DLL, которая уже была там зарегистрирована). Мне не очень нравится этот подход, хотя он зависит от версии DLL, которая может быть изменена в любое время. Надеюсь, MS просто добавит эту сборку в следующую версию .NET Framework.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" />
<bindingRedirect oldVersion="0.0.0.0-99.99.99.99" newVersion="4.0.1.0" />
<codeBase version="4.0.1.0" href="e:\exec\System.ValueTuple.dll" />
</dependentAssembly>
...
</assemblyBinding>
</runtime>
Ответ 2
У меня была эта проблема. Не на Localhost при разработке, а только на рабочем сервере. В конце концов, это был какой-то конфликт между .Net Framework 4.6.1 и мной, имеющим System.ValueTuple, установленный из Nuget в версии 4.5.0.
Решение оказалось для понижения пакета Nuget System.ValueTuple до 4.3.0. Тогда это работало, как будто ничто никогда не было проблемой.
Я подозреваю, что это произошло только на рабочем сервере, из-за установки другой версии .net framework.
Ответ 3
хорошо, это чувствует себя совершенно неправильно, но я режу
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
Это из моего web.config для основного приложения.
Я на самом деле просто смотрел, что случилось, чтобы увидеть, была ли основная зависимость или что-то в этом роде, не ожидая, что это произойдет. Это только продолжало работать, все новые функции, которые я добавил за последние несколько дней, все еще работают.
Ответ 4
FWIW, у меня была эта проблема в моем тестовом проекте с использованием Moq. Кто-то установил проект на .NET 4.7, но я был на 4.6.2. Не желая двигаться дальше до 4.7, решение было понизить версию до Moq 4.7.145. System.ValueTuple v 4.3.1 работал вместе с ним.
Ответ 5
Я столкнулся с тем же исключением, когда было несоответствие версии пакета nuget. (В DLL было 4.3.1, используемое в основной программе 4.3.0.) Я решил проблему, обновив пакеты до одной и той же версии... Проверка и унификация версий пакетов, возможно, также помогут вам.
Ответ 6
Решил это, установив .NET Framework 4.7.2 Runtime
на компьютер, на котором произошла ошибка. Просто и не нужно добавлять bindingRedirect
или понижение пакетов NuGet.
https://dotnet.microsoft.com/download/dotnet-framework/net472
Ответ 7
Моя проблема заключалась в том, что я разрабатывал против 4.6.1, но выпустил на 4.7.2. К счастью, я не против того, для какой платформы .Net был создан этот проект, поэтому я установил 4.7.2 на свой экземпляр разработчика, а затем обновил все пакеты Nuget.
(Использование SQLite на AWS EC2)
Ответ 8
У меня была такая же проблема с зависимостью AutoMapper 8.0.0.0 от версии 4.5 после обновления с .NET 4.5.1 до 4.6.1. Переустановка пакета Nuget automapper работала для меня.
Ответ 9
У меня та же проблема, я решаю проблему, изменив целевую рамку проекта на .Net Framwork 4.7.1.
System.ValueTuple теперь поддерживает .NET Framework 4.7
Ответ 10
Если вы не можете обновить .Net Framework до последней версии, затем понизьте пакет: Microsoft.Net.Compilers до версии до 2.10. Это решило проблему в моем случае.