Подтвердить что ты не робот

Azure Function, EF Core, Невозможно загрузить ComponentModel.Annotations 4.2.0.0

Я создал несколько библиотек .Net Standard 2.0, проверил выполнение через консольное приложение, а также несколько тестов - все хорошо.

Перейдите к функции Azure и получите следующую ошибку времени выполнения: enter image description here

Затем я пытаюсь загрузить эту конкретную версию в проект API Function: enter image description here

Я использую 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

4b9b3361

Ответ 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;
    }

}

Ответ 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.