Использование .NET Standard из веб-приложения .NET Framework завершается неудачно с сообщением «Не удалось загрузить файл или сборку ...» - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь использовать библиотеки .NET Standard в веб-приложениях .NET Framework ASP.NET, и я часто сталкиваюсь с ошибками, связанными с загрузкой типов. Я воспроизвел проблему следующим образом:

https://github.com/sgarshol/VTSample

Я создал библиотеку .NET Standard 2.0 с одним классом:

namespace VTLib
{
    public class VTMaker
    {
        public (int, string) GetVT()
        {
            return (3, "value");
        }
    }
}

Я ссылался на эту библиотеку как на ссылку проекта в консольном приложении и ASP.NET MVC приложении, оба .NET Framework v4.6.2. Оба проекта создают экземпляр класса и вызывают GetVT().

Консольное приложение работает нормально.

Веб-приложение не работает, и я получаю следующую ошибку:

Не удалось загрузить файл или сборку 'System.ValueTuple, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = cc7b13ffcd2ddd51' или одна из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Проверяя мою папку веб-приложения / bin, я обнаружил, что следующее .dlls:

/ bin / System.ValueTuple.dll (4.0.2.0, msil, .Net Framework v4.0) /bin/roslyn/System.ValueTuple.dll (4.0.1.0, msil, .Net Framework v.4.6.2)

Используя JetBrains dotPeek, я проверяю свое веб-приложение .dll и мою библиотеку .dll и получаю следующее:

  • .dll веб-приложения ссылается на System.ValueTuple (4.0.2.0), хотя в файле .csproj такой ссылки нет.
  • Библиотека .dll ссылается на netstandard (2.0.0.0) в качестве единой ссылки.

Я обнаружил, что могу "решить" проблему, вручную добавив инструкцию перенаправления сборки в файл Web.config:

<dependentAssembly>
    <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
...