Не удалось загрузить файл или сборку "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 работала для меня.

Ответ 10

Если вы не можете обновить .Net Framework до последней версии, затем понизьте пакет: Microsoft.Net.Compilers до версии до 2.10. Это решило проблему в моем случае.