Aws-lambda-dotnet: Ketergantungan Nuget melempar System.IO.FileNotFoundException

Dibuat pada 15 Mar 2019  ·  32Komentar  ·  Sumber: aws/aws-lambda-dotnet

Saya tidak yakin apakah ini masalah libphonenumber, atau masalah alat uji AWS Lambda. Ini memiliki nuansa masalah dengan alat uji.

Langkah-langkah repro:
1) Instal paket alat uji AWS Lambda: https://aws.amazon.com/blogs/developer/debugging-net-core-aws-lambda-functions-using-the-aws-net-mock-lambda-test- alat/
1) Buat aplikasi Lambda Tanpa Server kosong
2) Tambahkan paket libphonenumber sebagai ketergantungan
3) Dalam konstruktor Function , lakukan var foo = PhoneNumberUtil.GetInstance();
4) Jalankan debugger
5) Kirim permintaan apa pun

Konstruktor tidak berjalan sama sekali.

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()

Kasing repro terkecil yang bisa saya lampirkan di sini.
AWSServerlessApp.zip

investigating

Komentar yang paling membantu

Saya memiliki masalah yang sama dengan ketergantungan Google.Apis.Auth. Ini berfungsi dengan baik ketika digunakan ke AWS tetapi ketika saya mencoba menjalankannya secara lokal dengan alat uji, saya mendapatkan kesalahan ini. Saya menggunakan .NET Core 2.1 dan alat uji 0.9.2.

System.IO.FileLoadException: Tidak dapat memuat file atau rakitan 'Google.Apis.Auth, Version=1.35.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab'. Operasi tidak legal dalam kondisi saat ini.

Semua 32 komentar

Saya juga telah mengunduh kode sumber untuk libphonenumber, dan menambahkan csproj itu sebagai referensi proyek dalam solusi lambda. Itu dibangun dengan baik, tetapi segera setelah saya memanggil lambda melalui alat uji, kesalahan yang sama terjadi.

Saya telah membuka bug di proyek libphonenumber juga, karena saya tidak yakin di sisi mana masalahnya:
https://github.com/twcclegg/libphonenumber-csharp/issues/95

Hai @rianjs , kami sedang menyelidiki ini. Saya telah mengonfirmasi bahwa itu tidak berfungsi di alat uji, tetapi pustaka yang sama akan berfungsi di aplikasi konsol--seperti yang Anda nyatakan dalam masalah untuk repo lainnya. Saya juga telah memverifikasi bahwa beberapa perpustakaan lain bekerja dengan alat uji, jadi sekarang saya akan terus menyelidiki mengapa yang ini tidak. Beri tahu saya jika Anda memiliki pembaruan di pihak Anda. Terima kasih telah melaporkannya.

Jika kodenya terbuka, saya akan dengan senang hati mengerjakannya sendiri. ;P

Saya kira ini berfungsi dengan baik di lingkungan lambda "nyata".

Masalah:

Saya memiliki masalah serupa, tetapi dengan perpustakaan yang berbeda. Saya memiliki proyek lambda netcore2.1 yang mereferensikan Microsoft.EntityFrameworkCore 2.2.3 dan Microsoft.EntityFrameworkCore.Sqlite 2.2.3. Saat berjalan di studio visual dengan Alat Uji Mock Lambda, pengecualian berikut dilemparkan:

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)

Saya telah mengonfirmasi bahwa fungsi lambda ini dapat diterapkan dan dijalankan dengan sukses di lingkungan Lambda berbasis cloud AWS yang sebenarnya.

Lihat proyek reproduksi kecil terlampir

Sumber:

Saya mengkloning repo aws-lambda-dotnet dan menjalankan alat uji. Saya membuat unit test baru untuk menjalankan alat dan masuk ke kode. Alat uji menampilkan pengecualian selama metode Amazon.Lambda.TestTool.Runtime::LambdaAssemblyResolver::OnResolve. Metode ini tidak dapat menyelesaikan AssemblyName = Microsoft.Data.Sqlite dan akan mengembalikan null. Metode ini adalah metode terakhir yang dipanggil sebelum LoadContext harus memanggil System.IO.FileNotFoundException jika rakitan tidak diselesaikan.


Solusi yang diposting di masalah lain berfungsi. Dalam edisi itu, penulis hanya menurunkan versi ke versi 2.1.*. Jika kami menurunkan versi ke 2.1.8 untuk kedua referensi ef core, alat uji mulai bekerja kembali. Namun ini bukan pilihan bagi saya. Saya mencoba memanfaatkan fitur baru di ef core 2.2.*. IMO alat harus dapat memuat rakitan yang juga didukung di lambda.

Masalah terbuka di repo corefx ini dapat memberikan petunjuk tentang masalah yang mendasarinya.

Saya akan menjelajahi lebih jauh, tetapi saya tidak punya waktu. Ada ide?

AWSLambda_NetCore21-EfCore22Test.zip

Saya mengeluarkan versi 0.9.2 yang memiliki perubahan pada cara pencarian dependensi. Dengan perubahan ini saya dapat menjalankan fungsi lambda dengan alat ini yang menggunakan libphonenumber.

Jika Anda menggunakan Visual Studio dan AWS Toolkit untuk Visual Studio, pembaruan ke 0.9.2 akan terjadi secara otomatis saat berikutnya Anda membuka solusi dengan asumsi Anda sedang online.

Juga @rianjs , kode untuk alat uji tiruan adalah sumber terbuka dan dapat ditemukan di repo ini di https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool

Hai @normj ,

Terima kasih atas bantuannya selama ini. Saya memperbarui alat ke 0.9.2. Saya masih mendapatkan System.IO.FileNotFoundException. Apakah Anda dapat mereplikasi menggunakan proyek sampel saya yang tercantum di atas ?

Untuk saat ini, saya dapat mengatasinya dengan memulai fungsi lambda saya untuk pengembangan lokal melalui aplikasi konsol.

Hmm, ini masih tidak berhasil untuk saya.

Komentar saya sebelumnya, yang telah saya edit, salah. Masalah terakhir hanya PEBKAC. Majelis LibPhoneNumber ditemukan baik-baik saja.

Saya mengalami masalah ini di 0.9.2 dengan paket nuget yang dirujuk dari proyek lain yang bergantung pada proyek lambda saya.

Saya mengalami masalah yang sama di 0.9.2.
Alat uji sudah memuat Microsoft.Extensions.* 2.1. , jadi akan gagal jika kita ingin menggunakan Microsoft.Extensions. 2.2.*.

Bisakah Anda menyelesaikan masalah ini?

@jiabiao Saya mengalami masalah yang sama.

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)

Versi 0.9.2

@AngelVenchev Bisakah Anda mencoba mengubah versi dari 2.2 menjadi 2.1? Ini bekerja untuk saya untuk masalah serupa. Mungkin ada hubungannya dengan Lambda yang tidak mendukung .Net Core 2.2

@IdresAhmed inilah yang akhirnya saya lakukan, meskipun saya sekarang memiliki dua versi 2.2 untuk penyebaran ke lambda dan 2.1 untuk berjalan secara lokal.

@IdresAhmed @AngelVenchev Saya membuka permintaan fitur ini yang akan mengatasi masalah penggunaan versi berbeda dari Microsoft.Extensions.* kemudian dimuat oleh aplikasi web ASP.NET Core alat Pengujian

Saya memiliki masalah yang sama dengan ketergantungan Google.Apis.Auth. Ini berfungsi dengan baik ketika digunakan ke AWS tetapi ketika saya mencoba menjalankannya secara lokal dengan alat uji, saya mendapatkan kesalahan ini. Saya menggunakan .NET Core 2.1 dan alat uji 0.9.2.

System.IO.FileLoadException: Tidak dapat memuat file atau rakitan 'Google.Apis.Auth, Version=1.35.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab'. Operasi tidak legal dalam kondisi saat ini.

Saya mengalami masalah ini dan yakin saya mungkin telah menemukan penyebab "Operasi tidak sah dalam kondisi saat ini.". Maafkan format yang buruk dalam tanggapan di bawah ini.

Tools\LambdaTestTool\Amazon.Lambda.TestTool\Runtime\LambdaAssemblyResolver.cs OnResolving Line 79
dan lebih khusus lagi Baris 93:

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

Masalahnya di sini, adalah jika sebuah Majelis berisi beberapa runtime, itu hanya akan memilih yang pertama dalam daftar. Dalam beberapa kasus, ini adalah runtime unix yang tidak kompatibel dengan mesin windows yang dalam kasus saya, adalah sistem operasi yang saya gunakan untuk pengembangan.

Ini tidak akan menyebabkan masalah saat digunakan karena penerbitan proyek membuat dependensi dengan benar.

Misalnya, ketika sebuah proyek dikompilasi untuk debug, sebuah file bernama "[projectName].deps.json" dibuat.
Dalam file ini dalam kasus saya, saya melihat ini sebagai entri pertama untuk perpustakaan yang saya rujuk:

"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"
},

Untuk memverifikasi kecurigaan saya, saya menjalankan proyek, dan di visual studio membuka debug->windows->modules dan dapat melihat bahwa Majelis yang dimuat sebenarnya salah. Kode yang disebutkan di atas hanya mengambil ketergantungan pertama dalam daftar, yang tidak akan berfungsi pada platform windows.

Untuk kebutuhan saya, saya dapat mengubah baris awal LambdaAssemblyResolver.cs OnResolve 78 menjadi berikut:

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

Saya menambahkan filter untuk menarik hanya versi runtime yang dibuat untuk win 64 dan yang lebih baru, mengecualikan binari asli.

Saya tidak mengirimkan ini sebagai PR karena ini hanya 'cukup baik untuk saya' dan kasus khusus saya, tetapi sesuatu seperti itu dalam kombinasi dengan sistem operasi dan deteksi platform akan memungkinkan pemuatan perakitan yang tepat.

Tidak yakin apakah ini harus ditingkatkan ke permintaan fitur atau Bug.

Juga jika ada yang bisa saya lakukan untuk berkontribusi pada proyek ini, beri tahu saya.

Memiliki masalah serupa.

Kami mencoba menambahkan Swagger: <PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />

Ini berfungsi di aplikasi asp.net yang digunakan yang ada di belakang API Gateway.

Namun, dalam alat uji, ia melempar pengecualian ini.

Sangat mudah untuk mereproduksi, templat proyek Tanpa Server standar, tambahkan rakitan di atas, tambahkan baris services.AddSwaggerGen() dan app.UseSwagger(); di masing-masing metode ConfigureServices dan Configure.

Mulai aplikasi dengan alat Mock Lambda. Buat permintaan apa pun menggunakan template API Gateway dari alat. Ini akan membuang FileNotFoundException

Saya mendapat masalah yang sama

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()

di mana XYZ adalah .NET Standard 2.0 lib dan proyek Lambda adalah Core 2.1

Masalah yang sama

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()

Hai saya mendapat masalah yang sama, adakah bantuan untuk menyelesaikan ini?

Masalah yang sama hari ini dengan System.Data.SqlClient.dll

Hanya ingin tahu tentang ini .. tetapi saya menjalankan ProcMon dan melihat jalur System.Data.SqlClient.dll - (file yang saya alami masalah dalam konteks ini) saya perhatikan itu dua kali, ketika dotnet-lambda-test-tool -2.1.exe mencoba melakukan CreateFileMapping terhadap System.Data.SqlClient.dll itu mendapat hasil FILE TERKUNCI DENGAN HANYA PEMBACA. Yang setelah penelitian lebih lanjut menunjukkan bahwa itu dapat menyebabkan kesalahan "Tidak dapat memuat file atau perakitan". Saya pikir dengan memulai ulang Visual Studio 2019 sebagai Administrator, saya bisa menghilangkan kesalahan itu, tetapi tidak berhasil. Saya menduga bahwa orang lain yang memiliki masalah ini juga akan menemukan masalah ini dengan rakitan di Lambda yang mereka coba debug juga. Saya harap ini membantu seseorang. Saya masih mencari solusi.
FileLocked

Ok, ok, ok.. Bagi saya masalah ini adalah karena saya harus menurunkan versi paket System.Data.SqlClient Nuget ke 4.5.1. Untuk beberapa alasan, sesuatu yang lebih tinggi menghasilkan kesalahan "Tidak dapat memuat file atau rakitan" yang dibahas dalam utas ini. Versi 4.6 dan di atasnya memberi saya kesalahan itu saat men-debug secara lokal dengan alat debugging Lambda.

Ingin memberikan update status. Saat ini saya sedang mengerjakan versi .NET Core 3.1 dari alat ini untuk runtime .NET Core 3.1 Lambda yang akan datang. Pekerjaan untuk itu dapat dilacak di mock-testtool-31 .

Dalam versi ini saya menggunakan AssemblyDependencyResolver yang ditambahkan di .NET Core 3.0 untuk memuat fungsi Lambda di AssemblyLoadContext terpisah. Itu akan membantu masalah ini jika fungsi Lambda menggunakan versi perakitan yang berbeda kemudian dimuat oleh alat uji.

Bagaimana kita bisa menguji 3.1?

Saya mengalami masalah yang sama dengan proyek template super sederhana saya,
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()
Juga dengan Microsfot.Extensions.Configuration.Abstractions (terbaru 3.1.3)

Setelah membaca semua komentar saya menggunakan solusi yang sama seperti beberapa dari Anda. Saya harus menurunkan versi paket saya dan yang dirujuk oleh mereka ke versi yang lebih rendah. Dalam hal ini saya menggunakan 2.1.

Inilah yang saya miliki sekarang sehingga alat Mock saya dapat berfungsi.
image

Hanya untuk mengingatkan beberapa fakta tentang masalah ini.

  • Kompilasi proyek tanpa kesalahan
  • Proyek uji berjalan dengan sukses
  • Alat tiruan tidak berfungsi ketika kode yang menggunakan dll dijalankan.

Ini adalah baris yang menyebabkan kesalahan dalam kasus saya.
public MyFunction() : this(StartUp.Container.BuildServiceProvider()) {}
Ini Startup.cs saya

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

Versi 0.10.0 dirilis hari ini untuk .NET Core 2.1 dan .NET Core 3.1 yang sekarang memuat kode Lambda dalam AssemblyLoadContext terpisah. Saya percaya itu akan memperbaiki banyak masalah yang dilaporkan di sini. Saya akan menutup masalah ini karena sudah lama dan saya yakin ada beberapa masalah terpisah. Setelah menggunakan versi baru jika masih ada masalah, silakan buka edisi terpisah untuk memudahkan pelacakan.

Terima kasih @normj dan selamat, saya akan menguji

@normj
Hei di sana. Saya memiliki masalah yang sama 6 hari yang lalu. Saya mencoba untuk menutupi semua info yang saya miliki di posting terakhir dari utas ini. Saya rasa masalah ini belum terpecahkan sampai kami mendapat bukti.

Apakah Anda diuji dengan 3.1?

@Edulopez Sudahkah Anda mencoba versi terbaru yang keluar kemarin? Jika masalah masih ada, silakan buat masalah terpisah dengan repo Anda. Saya hanya merasa utas ini menjadi berat dan saya curiga banyak masalah yang dilaporkan akan diperbaiki dengan versi baru.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat