Я пытаюсь использовать библиотеки .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>