web-dev-qa-db-ja.com

Azure Function、EF Core、ComponentModel.Annotations 4.2.0.0をロードできません

私はいくつかの.Net Standard 2.0ライブラリを作成し、コンソールアプリケーションを介して実行をテストしました。また、いくつかのテストもすべて良好です。

Azure関数に移動し、次の実行時エラーを取得します: enter image description here

次に、その特定のバージョンをAPI関数プロジェクトにダウンロードしようとします: enter image description here

Visual Studioバージョン15.7.0プレビュー5.0を使用しています。コンソールおよびテストプロジェクトがそうであるように、Azure Functionを4.7に更新しました。

これにあまりにも多くの時間を費やしていました..だから私は解像度がおかしいものではないことを望んでいます。 Ef Core 2.1.0-rc1-finalも混在しています。 Required、MaxLength、NotMappedのデータ注釈を使用します。

グラフィックのエラー:Microsoft.EntityFrameworkCore:ファイルまたはアセンブリ 'System.ComponentModel.Annotations、Version = 4.2.0.0を読み込めませんでした

13
codeputer

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;
    }

}
20
Igne B

私はここの指示に従いました:

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です。

8
Roy Salisbury

パッケージマネージャーコンソールからnugetコマンドを使用してプロジェクトに最新のComponentModel参照を追加すると、すべてのタイプのアプリケーション(コンソール/ Web/Azure)でこの問題が解決されます。

Install-Package System.ComponentModel.Annotations -Version 4.5.0

ComponentModelには4.2.0.0のリリースがないため、最新をインストールします。参照: -

Neget Gallery

2
mgsdew

私は同じ問題を抱えていて、Microsoft.EntityFrameworkCoreパッケージをバージョン2.0.3にダウングレードすることでした。このバージョンは、Microsoft.NET.Sdk.FunctionsのパッケージであるSystem.ComponentModel.Annotations 4.4.0に依存しています。 1.0.14が必要です。 System.ComponentModel.Annotations 4.5.0以降に明示的に依存している場合は、それを4.4.0にダウングレードする必要もあります。

1
Eugen Podaru

受け入れられた応答は、_+=_が誤って使用されるとCPUリークを引き起こし、関数アプリを停止させます。 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;
    }
}
_

使用するには、IoCが解決する前にFunctionsAssemblyResolver.StaticInstance()を呼び出すだけです。これは、IoC以外のアプローチにも使用できます。

1
Jesse M