Azure Function, EF Core, Невозможно загрузить ComponentModel.Annotations 4.2.0.0
Я создал несколько библиотек .Net Standard 2.0, проверил выполнение через консольное приложение, а также несколько тестов - все хорошо.
Перейдите к функции Azure и получите следующую ошибку времени выполнения:
Затем я пытаюсь загрузить эту конкретную версию в проект API Function:
Я использую Visual Studio версии 15.7.0 Preview 5.0. Я обновил функцию Azure до 4.7... как консольный и тестовый проекты - и они работают.
Занимался этим слишком много часов... поэтому я надеюсь, что резолюция не является чем-то сумасшедшим. Ef Core 2.1.0-rc1-final также в миксе. Использование аннотаций данных для Required, MaxLength, NotMapped.
Ошибка в графике говорит: Microsoft.EntityFrameworkCore: не удалось загрузить файл или сборку 'System.ComponentModel.Annotations, Version = 4.2.0.0
Ответы
Ответ 1
Я предлагаю запустить эту функцию ниже, как только вы начнете свою Azure Function. Он перенаправит любую сборку на существующую версию.
public class FunctionsAssemblyResolver
{
public static void RedirectAssembly()
{
var list = AppDomain.CurrentDomain.GetAssemblies().OrderByDescending(a => a.FullName).Select(a => a.FullName).ToList();
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var requestedAssembly = new AssemblyName(args.Name);
Assembly assembly = null;
AppDomain.CurrentDomain.AssemblyResolve -= CurrentDomain_AssemblyResolve;
try
{
assembly = Assembly.Load(requestedAssembly.Name);
}
catch (Exception ex)
{
}
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
return assembly;
}
}
Ответ 2
Я следовал инструкциям здесь:
https://codopia.wordpress.com/2017/07/21/how-to-fix-the-assembly-binding-redirect-problem-in-azure-functions/
И добавил следующую переадресацию:
"BindingRedirects": "[ { "ShortName": "System.ComponentModel.Annotations", "RedirectToVersion": "4.2.1.0", "PublicKeyToken": "b03f5f7f11d50a3a" } ]"
ПРИМЕЧАНИЕ. Его не v 4.5.0.0... Фактически это 4.2.1.0.
Ответ 3
У меня была такая же проблема, и я решил переопределить пакет Microsoft.EntityFrameworkCore до версии 2.0.3, который имеет зависимость от System.ComponentModel.Annotations 4.4.0, который является пакетом, который Microsoft.NET.Sdk.Functions 1.0.14. Если у вас есть явная зависимость от System.ComponentModel.Annotations 4.5.0 или выше, вам необходимо понизить ее до 4.4.0.
Ответ 4
Добавление последней ссылки ComponentModel в ваш проект с помощью команды nuget из консоли диспетчера пакетов решит эту проблему для всех типов приложений (Console/Web/Azure).
Install-Package System.ComponentModel.Annotations -Version 4.5.0
Поскольку ComponentModel не имеет версии 4.2.0.0, поэтому попробуйте установить последнюю версию. Ссылка: -
Галерея Негет
Ответ 5
Принятый ответ вызовет утечку процессора из-за +=
если он используется не по назначению, и остановит ваше функциональное приложение. Если вы используете IoC, лучше использовать синглтон. Вот:
public class FunctionsAssemblyResolver
{
static FunctionsAssemblyResolver()
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
// At least one static member needs to be invoked in order to execute the static constructor,
// but it will only run the constructor once.
public static void StaticInstance() { }
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var requestedAssembly = new AssemblyName(args.Name);
try
{
// Feel free to resolve any other assemblies, but this will take care of Annotations
return requestedAssembly.Name == "System.ComponentModel.Annotations"
? Assembly.Load(requestedAssembly.Name)
: null;
}
catch
{
// do nothing
}
return null;
}
}
Чтобы использовать, просто вызовите FunctionsAssemblyResolver.StaticInstance()
до разрешения IoC. Это также может быть использовано для любого подхода без IoC.