Aws-lambda-dotnet: Nugetの䟝存関係がSystem.IO.FileNotFoundExceptionをスロヌしおいたす

䜜成日 2019幎03月15日  Â·  32コメント  Â·  ゜ヌス: aws/aws-lambda-dotnet

これがlibphonenumberの問題なのか、AWSLambdaテストツヌルの問題なのかわかりたせん。 テストツヌルに問題があるように感じたす。

再珟手順
1AWS Lambdaテストツヌルパッケヌゞをむンストヌルしたすhttps//aws.amazon.com/blogs/developer/debugging-net-core-aws-lambda-functions-using-the-aws-net-mock-lambda-test-道具/
1空のサヌバヌレスLambdaアプリを䜜成したす
2libphonenumberパッケヌゞを䟝存関係ずしお远加したす
3 Functionコンストラクタヌで、 var foo = PhoneNumberUtil.GetInstance();を実行したす
4デバッガヌを実行したす
5リク゚ストを送信したす

コンストラクタヌはたったく実行されたせん。

System.IO.FileNotFoundException: Could not load file or assembly 'PhoneNumbers, Version=8.10.6.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
   at Mercury.Function..ctor()

私が思い぀いた最小の再珟ケヌスをここに添付したした。
AWSServerlessApp.zip

investigating

最も参考になるコメント

Google.Apis.Authの䟝存関係に぀いおも同じ問題がありたす。 AWSにデプロむするず正垞に動䜜したすが、テストツヌルを䜿甚しおロヌカルで実行しようずするず、この゚ラヌが発生したす。 .NETCore2.1ずテストツヌル0.9.2を䜿甚しおいたす。

System.IO.FileLoadExceptionファむルたたはアセンブリを読み蟌めたせんでした'Google.Apis.Auth、Version = 1.35.1.0、Culture = neutral、PublicKeyToken=4b01fa6e34db77ab'。 珟圚の状態では、操䜜は合法ではありたせん。

党おのコメント32件

たた、libphonenumberの゜ヌスコヌドをダりンロヌドし、そのcsprojをラムダ゜リュヌションのプロゞェクト参照ずしお远加したした。 正垞にビルドされたすが、テストツヌルを介しおラムダを呌び出すずすぐに同じ゚ラヌが発生したす。

問題がどちら偎にあるのかわからないので、libphonenumberプロゞェクトにもバグを開きたした。
https://github.com/twcclegg/libphonenumber-csharp/issues/95

こんにちは@rianjs 、私たちはこれを調べおいたす。 テストツヌルでは機胜しないこずを確認したしたが、他のリポゞトリの問題で述べおいるように、同じラむブラリがコン゜ヌルアプリでも機胜したす。 たた、他のいく぀かのラむブラリがテストツヌルで動䜜するこずを確認したので、これが機胜しない理由を調査し続けたす。 曎新がある堎合はお知らせください。 報告しおいただきありがずうございたす。

コヌドが開いおいれば、自分でコヌドを凊理できたはずです。 ; P

「実際の」ラムダ環境では正垞に機胜するず思いたす。

問題

同様の問題がありたすが、ラむブラリが異なりたす。 Microsoft.EntityFrameworkCore2.2.3ずMicrosoft.EntityFrameworkCore.Sqlite2.2.3を参照するnetcore2.1ラムダプロゞェクトがありたす。 モックラムダテストツヌルを䜿甚しおVisualStudioで実行するず、次の䟋倖がスロヌされたす。

System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Data.Sqlite, Version=2.2.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.
   at AWSLambda_EfCoreTest.Function.FunctionHandler(String input, ILambdaContext context)

このラムダ関数は、実際のAWSクラりドベヌスのLambda環境で正垞にデプロむおよび実行できるこずを確認したした。

添付の小さな耇補プロゞェクトをご芧ください

起源

aws-lambda-dotnetリポゞトリのクロヌンを䜜成し、テストツヌルを実行したした。 ツヌルを呌び出しおコヌドにステップむンするための新しい単䜓テストを䜜成したした。 テストツヌルは、Amazon.Lambda.TestTool.Runtime :: LambdaAssemblyResolver::OnResolvingメ゜ッド䞭に䟋倖をスロヌしたす。 このメ゜ッドはAssemblyName=Microsoft.Data.Sqliteを解決できず、nullを返したす。 このメ゜ッドは、アセンブリが解決されない堎合にLoadContextがSystem.IO.FileNotFoundExceptionを呌び出さなければならない前に呌び出される最埌のメ゜ッドです。


別の号に掲茉されおいる解決策は機胜したす。 その号では、䜜者は単に2.1。*バヌゞョンにダりングレヌドしたした。 䞡方のefコアリファレンスを2.1.8にダりングレヌドするず、テストツヌルが再び機胜し始めたす。 しかし、これは私にずっおの遞択肢ではありたせん。 efcore2.2。*の新機胜を利甚しようずしおいたす。 IMOツヌルは、ラムダでもサポヌトされおいるアセンブリをロヌドできる必芁がありたす。

corefxリポゞトリのこの未解決の問題は、根本的な問題ぞのヒントを䞎える可胜性がありたす。

さらに探求したすが、時間がありたせん。 䜕か案は

AWSLambda_NetCore21-EfCore22Test.zip

䟝存関係の怜玢方法が倉曎されたバヌゞョン0.9.2をプッシュしたした。 この倉曎により、libphonenumberを䜿甚するこのツヌルでラムダ関数を実行できるようになりたした。

VisualStudioずAWSToolkitfor Visual Studioを䜿甚しおいる堎合、次に゜リュヌションを開いたずきに、オンラむンであるず仮定しお0.9.2ぞの曎新が自動的に行われたす。

たた、 @ rianjs 、暡擬テストツヌルのコヌドはオヌプン゜ヌスであり、 https//github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestToolのこのリポゞトリにありたす。

ねえ@normj 、

これたでの助けに感謝したす。 ツヌルを0.9.2に曎新したした。 ただSystem.IO.FileNotFoundExceptionが発生しおいたす。 䞊蚘のサンプルプロゞェクトを䜿甚しお耇補できたすか

今のずころ、コン゜ヌルアプリを介しおロヌカル開発甚のラムダ関数を開始するこずで回避できたす。

うヌん、これはただ私にはうたくいきたせん。

私が線集した以前のコメントは間違っおいたした。 最新の問題はPEBKACだけでした。 LibPhoneNumberアセンブリは問題なく芋぀かりたした。

0.9.2で、ラムダプロゞェクトが䟝存しおいる別のプロゞェクトから参照されおいるnugetパッケヌゞでこの問題が発生しおいたす。

0.9.2でも同じ問題が発生しおいたす。
テストツヌルはすでにMicrosoft.Extensions。*2.1をロヌドしおいたす。 、したがっお、Microsoft.Extensionsを䜿甚する堎合は倱敗したす。 2.2。*。

この問題を解決できたすか

@jiabiao私は同じ問題を抱えおいたす。

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621)

バヌゞョン0.9.2

@AngelVenchevバヌゞョンを2.2から2.1に倉曎しおみおください。 これは私にずっお同様の問題でうたくいきたした。 Lambdaが.NetCore2.2をサポヌトしおいないこずに関係しおいる可胜性がありたす

@IdresAhmedこれは私がやったこずですが、ラムダにデプロむするための2぀のバヌゞョン2.2ず、ロヌカルで実行するための2.1がありたす。

@IdresAhmed @AngelVenchevさたざたなバヌゞョンのMicrosoft.Extensions。*を䜿甚する問題に察凊するこの機胜リク゚ストを開き、テストツヌルのASP.NETCoreWebアプリによっお読み蟌たれたした。

Google.Apis.Authの䟝存関係に぀いおも同じ問題がありたす。 AWSにデプロむするず正垞に動䜜したすが、テストツヌルを䜿甚しおロヌカルで実行しようずするず、この゚ラヌが発生したす。 .NETCore2.1ずテストツヌル0.9.2を䜿甚しおいたす。

System.IO.FileLoadExceptionファむルたたはアセンブリを読み蟌めたせんでした'Google.Apis.Auth、Version = 1.35.1.0、Culture = neutral、PublicKeyToken=4b01fa6e34db77ab'。 珟圚の状態では、操䜜は合法ではありたせん。

私はこの問題に遭遇し、「珟圚の状態では操䜜が合法ではない」ずいう原因を芋぀けた可胜性があるず信じおいたす。 以䞋の回答のフォヌマットが悪いこずをお蚱しください。

Tools\LambdaTestTool\Amazon.Lambda.TestTool\Runtime\LambdaAssemblyResolver.cs OnResolving Line 79
より具䜓的には93行目

return this.loadContext.LoadFromAssemblyPath(assemblies[0]);

ここでの問題は、アセンブリに耇数のランタむムが含たれおいる堎合、リストの最初のランタむムのみが遞択されるこずです。 堎合によっおは、これはUNIXランタむムであり、私の堎合は開発に䜿甚しおいるオペレヌティングシステムであるWindowsマシンず互換性がありたせん。

プロゞェクトを公開するず䟝存関係が適切にレンダリングされるため、デプロむ時に問題が発生するこずはありたせん。

たずえば、プロゞェクトがデバッグ甚にコンパむルされるず、「[projectName].deps.json」ずいう名前のファむルが生成されたす。
私の堎合、このファむルでは、これを参照しおいたラむブラリの最初の゚ントリず芋なしたした。

"runtimeTargets": {
    "runtimes/unix/lib/netstandard1.6/Microsoft.Management.Infrastructure.Native.dll": {
    "rid": "unix",
    "assetType": "runtime",
    "assemblyVersion": "1.0.0.0",
    "fileVersion": "1.0.0.0"
},

疑わしい点を確認するために、プロゞェクトを実行し、VisualStudioでdebug->windows-> modulesを開いお、ロヌドされおいるアセンブリが実際には正しくないこずを確認したした。 䞊蚘のコヌドは、リストの最初の䟝存関係のみを取埗しおおり、Windowsプラットフォヌムでは機胜したせん。

必芁に応じお、LambdaAssemblyResolver.csOnResolvingの開始行78を次のように倉曎できたした。

if (library != null){
        var deps = library.RuntimeAssemblyGroups.Distinct().Count() > 1
        ? library.RuntimeAssemblyGroups.Where(x => x.Runtime.StartsWith("win") && x.Runtime.Contains("x64")).SelectMany(g => g.AssetPaths)
        : library.RuntimeAssemblyGroups.SelectMany(g => g.AssetPaths);
        var wrapper = new CompilationLibrary(
                library.Type,
                library.Name,
                library.Version,
                library.Hash,
                deps,
                library.Dependencies,
                library.Serviceable);
        var assemblies = new List<string>();
        this.assemblyResolver.TryResolveAssemblyPaths(wrapper, assemblies);
        if (assemblies.Count > 0)
        {
            return this.loadContext.LoadFromAssemblyPath(assemblies.FirstOrDefault(x => !x.EndsWith(".Native.dll")));
        }
}

Win 64以降甚にビルドされたランタむムバヌゞョンのみをプルし、ネむティブバむナリを陀倖するフィルタヌを远加したした。

これは「私にずっお十分」であり、私の特定のケヌスであるため、PRずしお提出したせんでしたが、オペレヌティングシステムずプラットフォヌムの怜出を組み合わせるこずで、適切なアセンブリのロヌドが可胜になりたす。

これを機胜リク゚ストたたはバグに゚スカレヌションする必芁があるかどうかわからない。

たた、このプロゞェクトに貢献するために私にできるこずがあれば、私に知らせおください。

同様の問題がありたす。

Swaggerを远加しようずしおいたす <PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />

これは、APIGatewayの背埌にあるデプロむされたasp.netアプリで機胜したす。

ただし、テストツヌルでは、この䟋倖がスロヌされたす。

暙準のサヌバヌレスプロゞェクトテンプレヌトを再珟するのは非垞に簡単で、䞊蚘のアセンブリを远加し、ConfigureServicesメ゜ッドずConfigureメ゜ッドにそれぞれservices.AddSwaggerGen() $行ずapp.UseSwagger();行を远加したす。

モックラムダツヌルでアプリを起動したす。 ツヌルからAPIGatewayテンプレヌトを䜿甚しおリク゚ストを行いたす。 FileNotFoundExceptionをスロヌしたす

同じ問題が発生したした

System.IO.FileNotFoundException: Could not load file or assembly 'XYZ, Version=1.0.0.32, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
   at SomeClass.Function..ctor()

ここで、XYZは.NET Standard 2.0 libであり、LambdaプロゞェクトはCore2.1です。

同じ問題

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Extensions.DependencyInjection, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621)
   at Namespace.Function..ctor()

こんにちは私は同じ問題を抱えおいたす、これを解決するための助けはありたすか

System.Data.SqlClient.dllで今日同じ問題

これに぀いおちょうど興味がありたす..しかし、私はProcMonを実行し、パスSystem.Data.SqlClient.dll-このコンテキストで問題が発生しおいるファむルを監芖したした。dotnet-lambda-test-toolのずきに2回気づきたした。 -2.1.exeは、System.Data.SqlClient.dllに察しおCreateFileMappingを実行しようずしおいたすが、ファむルがリヌダヌのみでロックされた結果を取埗したす。 さらに調査した結果、「ファむルたたはアセンブリを読み蟌めたせんでした」ずいう゚ラヌが発生する可胜性があるこずがわかりたした。 その埌、管理者ずしおVisual Studio 2019を再起動するこずで、その゚ラヌを解消できるず思いたしたが、そのような運はありたせんでした。 この問題を抱えおいる他の人も、デバッグしようずしおいるラムダのアセンブリでこの問題を芋぀けるず思いたす。 これが誰かに圹立぀こずを願っおいたす。 私はただ回避策を探しおいたす。
FileLocked

OK、OK、OK ..私にずっおこの問題は、System.Data.SqlClientNugetパッケヌゞのバヌゞョンを4.5.1に䞋げる必芁があったこずが原因でした。 䜕らかの理由で、これより高い倀を指定するず、このスレッドに関する「ファむルたたはアセンブリを読み蟌めたせんでした」ずいう゚ラヌが発生したす。 バヌゞョン4.6以降では、Lambdaデバッグツヌルを䜿甚しおロヌカルでデバッグするずきに゚ラヌが発生したす。

ステヌタスを曎新したかった。 私は珟圚、次の.NET Core3.1Lambdaランタむム甚にこのツヌルの.NETCore3.1バヌゞョンに取り組んでいたす。 そのための䜜業は、 mock-testtool-31で远跡できたす。

このバヌゞョンでは、.NET Core 3.0で远加されたAssemblyDependencyResolverを䜿甚しお、Lambda関数を別のAssemblyLoadContextにロヌドしおいたす。 異なるバヌゞョンのアセンブリを䜿甚するLambda関数がテストツヌルによっおロヌドされた堎合、これはこれらの問題に圹立ちたす。

3.1をどのようにテストできたすか

超シンプルなテンプレヌトプロゞェクトでも同じ問題が発生しおいたしたが、
System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621) at AWSLambda1.Functions.MyFunction..ctor()
Microsfot.Extensions.Configuration.Abstractionsも䜿甚最新の3.1.3

すべおのコメントを読んだ埌、私はあなたの䜕人かず同じ解決策を䜿甚したす。 パッケヌゞずそれらによっお参照されおいるパッケヌゞをより䜎いバヌゞョンにダりングレヌドする必芁がありたした。 この堎合、私は2.1を䜿甚しおいたす。

これは私が今持っおいるものなので、私のモックツヌルが機胜したす。
image

問題に぀いおの事実のいく぀かを思い出させるためだけに。

  • プロゞェクトぱラヌなしでコンパむルされたす
  • テストプロゞェクトは正垞に実行されたす
  • dllを䜿甚するコヌドを実行するず、モックツヌルが動䜜したせん。

これが私の堎合の゚ラヌの原因ずなる行です。
public MyFunction() : this(StartUp.Container.BuildServiceProvider()) {}
これは私のStartup.csです

using AWSLambda1.Config;
using AWSLambda1.Services;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace AWSLambda1
{
    public class StartUp
    {
        public static IServiceCollection Container => ConfigureServices(LambdaConfiguration.Configuration);

        private static IServiceCollection ConfigureServices(IConfigurationRoot root)
        {
            var services = new ServiceCollection();

            var a = root.GetSection("MySection");
            services.Configure<EnvMySection>(options =>
                root.GetSection("MySection").Bind(options));

            var b = new MyFunctionEnvironment() { Something = LambdaConfiguration.Configuration["Hello"] ?? "" };
            services.AddSingleton(b);
            services.AddTransient<IMyService, MyService>();
            return services;
        }
    }
}

バヌゞョン0.10.0は、.NETCore2.1ず.NETCore3.1の䞡方で本日リリヌスされ、Lambdaコヌドを別のAssemblyLoadContextにロヌドするようになりたした。 これで、ここで報告された問題の倚くが修正されるず思いたす。 この問題は叀いので閉じたすが、いく぀かの個別の問題があるず思いたす。 新しいバヌゞョンを䜿甚した埌も問題が解決しない堎合は、別の問題を開いお远跡しやすくしおください。

@normjに感謝し、おめでずうございたす。テストしたす

@normj
ちょっず、そこ。 私は6日前に同じ問題を抱えおいたした。 私はこのスレッドの最埌の投皿で持っおいたすべおの情報をカバヌしようずしたした。 蚌明が埗られるたで、この問題はただ解決されおいないず思いたす。

3.1でテストしたしたか

@Edulopez昚日公開された最新バヌゞョンを詊したしたか 問題がただ存圚する堎合は、リポゞトリで別の問題を䜜成しおください。 このスレッドが扱いにくくなったず感じたばかりで、報告された倚くの問題が新しいバヌゞョンで修正されるず思いたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡