Aws-lambda-dotnet: تؤدي تبعية Nuget إلى طرح System.IO.FileNotFoundException

تم إنشاؤها على ١٥ مارس ٢٠١٩  ·  32تعليقات  ·  مصدر: aws/aws-lambda-dotnet

لست متأكدًا مما إذا كانت هذه مشكلة libphonenumber أم مشكلة في أداة اختبار AWS Lambda. لديه شعور بوجود مشكلة في أداة الاختبار.

خطوات Repro:
1) قم بتثبيت حزمة أدوات اختبار AWS Lambda: https://aws.amazon.com/blogs/developer/debugging-net-core-aws-lambda-functions-using-the-aws-net-mock-lambda-test- أداة/
1) أنشئ تطبيق Serverless 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 ولكن عندما أحاول تشغيله محليًا باستخدام أداة الاختبار ، أحصل على هذا الخطأ. أنا أستخدم .NET Core 2.1 وأداة الاختبار 0.9.2.

System.IO.FileLoadException: تعذر تحميل الملف أو التجميع 'Google.Apis.Auth ، الإصدار = 1.35.1.0 ، الثقافة = محايد ، PublicKeyToken = 4b01fa6e34db77ab'. العملية ليست قانونية في الحالة الحالية.

ال 32 كومينتر

لقد قمت أيضًا بتنزيل الكود المصدري لـ libphonenumber ، وأضفت هذا csproj كمرجع مشروع في حل lambda. إنه يبني جيدًا ، ولكن بمجرد استدعاء لامدا عبر أداة الاختبار ، يحدث نفس الخطأ.

لقد فتحت أيضًا خطأً في مشروع libphonenumber ، لأنني لست متأكدًا من الجانب الذي توجد فيه المشكلة:
https://github.com/twcclegg/libphonenumber-csharp/issues/95

مرحبًا rianjs ، نحن نبحث في هذا. لقد أكدت أنها لا تعمل في أداة الاختبار ، ولكن نفس المكتبة ستعمل في تطبيق وحدة التحكم - كما ذكرت في المشكلة الخاصة بالمستودع الآخر. لقد تحققت أيضًا من أن بعض المكتبات الأخرى تعمل باستخدام أداة الاختبار ، لذلك سأستمر الآن في التحقيق في سبب عدم عمل هذه المكتبة. اسمحوا لي أن أعرف إذا كان لديك تحديثات من جانبك. شكرا على الإبلاغ عنها.

إذا كان الرمز مفتوحًا ، فسأكون سعيدًا للعمل من خلاله بنفسي. ؛ ص

أعتقد أنه يعمل بشكل جيد في بيئة لامدا "الحقيقية".

المشكلة:

لدي مشكلة مماثلة ، لكن مع مكتبة مختلفة. لدي مشروع netcore2.1 lambda يشير إلى Microsoft.EntityFrameworkCore 2.2.3 و Microsoft.EntityFrameworkCore.Sqlite 2.2.3. عند التشغيل في استوديو مرئي باستخدام أداة اختبار Mock Lambda ، يتم طرح الاستثناء التالي:

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)

لقد أكدت أنه يمكن نشر وظيفة lambda وتشغيلها بنجاح في بيئة Lambda الحقيقية القائمة على السحابة على AWS.

انظر مشروع الاستنساخ الصغير المرفق

المصدر:

لقد قمت باستنساخ aws-lambda-dotnet repo وقمت بتشغيل أداة الاختبار. لقد قمت بإنشاء اختبار وحدة جديد لاستدعاء الأداة والدخول إلى الكود. تطرح أداة الاختبار الاستثناء أثناء طريقة Amazon.Lambda.TestTool.Runtime :: LambdaAssemblyResolver :: OnResolving. لا يمكن لهذه الطريقة حل AssemblyName = Microsoft.Data.Sqlite وستُرجع فارغة. هذه الطريقة هي آخر طريقة يتم استدعاؤها قبل أن يقوم LoadContext باستدعاء System.IO.FileNotFoundException إذا لم يتم حل التجميع.


يعمل الحل المنشور في إصدار آخر . في هذا العدد ، خفض المؤلف ببساطة إلى الإصدار 2.1. *. إذا قمنا بالرجوع إلى الإصدار 2.1.8 لكلا المراجعين الأساسيين ، فستبدأ أداة الاختبار في العمل مرة أخرى. لكن هذا ليس خيارا بالنسبة لي. أحاول الاستفادة من الميزات الجديدة في ef core 2.2. *. يجب أن تكون الأداة IMO قادرة على تحميل التجميعات المدعومة أيضًا في lambda.

قد تعطي هذه المشكلة المفتوحة في corefx repo تلميحات حول المشكلة الأساسية.

سأستكشف المزيد ، لكن ليس لدي الوقت. أيه أفكار؟

AWSLambda_NetCore21-EfCore22Test.zip

لقد دفعت الإصدار 0.9.2 الذي يحتوي على تغيير في كيفية البحث عن التبعيات. بفضل هذا التغيير ، تمكنت من تنفيذ وظيفة lambda باستخدام هذه الأداة التي تستخدم libphonenumber.

إذا كنت تستخدم Visual Studio ومجموعة أدوات AWS لبرنامج Visual Studio ، فمن المفترض أن يتم التحديث إلى 0.9.2 تلقائيًا في المرة التالية التي تفتح فيها الحل الخاص بك على افتراض أنك متصل بالإنترنت.

أيضًا rianjs ، رمز أداة الاختبار التجريبي مفتوح المصدر ويمكن العثور عليه في هذا الريبو على https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool

مرحبًا normj ،

شكرا للمساعدة حتى الآن. لقد قمت بتحديث الأداة إلى 0.9.2. ما زلت أحصل على System.IO.FileNotFoundException. هل أنت قادر على التكرار باستخدام نموذج مشروعي المذكور أعلاه ؟

في الوقت الحالي ، يمكنني حل المشكلة عن طريق بدء تشغيل وظائف lambda الخاصة بي من أجل التطوير المحلي عبر تطبيق وحدة التحكم.

حسنًا ، ما زال هذا لا يعمل بالنسبة لي.

تعليقي السابق ، الذي قمت بتحريره ، كان خاطئًا. أحدث مشكلة كانت مجرد PEBKAC. تم العثور على مجموعة LibPhoneNumber على ما يرام.

أواجه هذه المشكلة في 0.9.2 مع حزمة nuget التي تمت الإشارة إليها من مشروع آخر يعتمد عليه مشروع lambda.

أواجه نفس المشكلة في 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 .Net Core 2.2

IdresAhmed هذا ما انتهيت به ، على الرغم من أن لدي الآن نسختين 2.2 للنشر على lambda و 2.1 للتشغيل محليًا.

IdresAhmedAngelVenchev لقد فتحت طلب الميزة هذا الذي سيعالج مشكلة استخدام إصدارات مختلفة من Microsoft.Extensions. * ثم تم تحميله بواسطة تطبيق الويب ASP.NET Core الخاص بأداة الاختبار

لدي نفس المشكلة مع تبعية Google.Apis.Auth. إنه يعمل بشكل جيد عند نشره في AWS ولكن عندما أحاول تشغيله محليًا باستخدام أداة الاختبار ، أحصل على هذا الخطأ. أنا أستخدم .NET Core 2.1 وأداة الاختبار 0.9.2.

System.IO.FileLoadException: تعذر تحميل الملف أو التجميع 'Google.Apis.Auth ، الإصدار = 1.35.1.0 ، الثقافة = محايد ، PublicKeyToken = 4b01fa6e34db77ab'. العملية ليست قانونية في الحالة الحالية.

واجهت هذه المشكلة وأعتقد أنني ربما وجدت سبب "العملية ليست قانونية في الوضع الحالي.". يرجى المعذرة على التنسيق السيئ في الرد أدناه.

Tools\LambdaTestTool\Amazon.Lambda.TestTool\Runtime\LambdaAssemblyResolver.cs OnResolving Line 79
وبشكل أكثر تحديدًا السطر 93:

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

تكمن المشكلة هنا في أنه إذا احتوى التجميع على عدة أوقات تشغيل ، فسيتم تحديد الأول فقط في القائمة. في بعض الحالات ، يكون هذا وقت تشغيل unix غير متوافق مع جهاز windows وهو في حالتي هو نظام التشغيل الذي أستخدمه للتطوير.

لن يتسبب هذا في مشكلة عند النشر لأن نشر المشروع يعرض التبعيات بشكل صحيح.

على سبيل المثال ، عندما يتم تجميع مشروع لتصحيح الأخطاء ، يتم إنشاء ملف يسمى "[اسم المشروع] .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"
},

للتحقق من شكوكي ، قمت بتشغيل المشروع ، وفي الاستوديو المرئي ، فتحت وحدات التصحيح-> windows-> وحدات ويمكن أن ترى أن التجميع الذي يتم تحميله كان في الواقع غير صحيح. كان الرمز المذكور أعلاه يأخذ فقط التبعية الأولى في القائمة ، والتي لن تعمل على نظام Windows الأساسي.

لتلبية احتياجاتي ، تمكنت من تعديل LambdaAssemblyResolver.cs OnResolving في سطر البداية 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" />

إنه يعمل في تطبيق asp.net المنتشر خلف بوابة API.

ومع ذلك ، فإنه يطرح هذا الاستثناء في أداة الاختبار.

من السهل جدًا إعادة إنتاج قالب مشروع قياسي بدون خادم وإضافة التجميع أعلاه وإضافة خطوط services.AddSwaggerGen() و app.UseSwagger(); في أساليب ConfigureServices و Configure على التوالي.

ابدأ التطبيق باستخدام أداة Mock Lambda. قم بإجراء أي طلب باستخدام قالب API Gateway من الأداة. سوف يرمي 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 هو Core 2.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 -2.1.exe يحاول تنفيذ CreateFileMapping مقابل System.Data.SqlClient.dll يحصل على نتيجة تأمين الملف مع القراء فقط. والذي يظهر بعد إجراء مزيد من البحث أنه يمكن أن يتسبب في حدوث خطأ "تعذر تحميل الملف أو التجميع". اعتقدت أنه من خلال إعادة تشغيل Visual Studio 2019 كمسؤول ، يمكنني التخلص من هذا الخطأ ، لكن لم يحالفني الحظ. أظن أن الآخرين الذين لديهم هذه المشكلة سيجدون أيضًا هذه المشكلة مع التجمعات في Lambda التي يحاولون تصحيحها أيضًا. آمل أن يساعد هذا شخص ما. ما زلت أبحث عن حل بديل.
FileLocked

حسنًا ، حسنًا ، حسنًا .. كانت هذه المشكلة بالنسبة لي بسبب حقيقة أنني اضطررت إلى خفض إصدار حزمة System.Data.SqlClient Nuget إلى 4.5.1. لسبب ما ، أي شيء أعلى ينتج عن الخطأ "تعذر تحميل الملف أو التجميع" الذي يدور حوله مؤشر الترابط هذا. الإصدار 4.6 وما فوق يعطيني هذا الخطأ عند التصحيح محليًا باستخدام أداة تصحيح الأخطاء Lambda.

أردت أن أعطي تحديث الحالة. أنا أعمل حاليًا على إصدار .NET Core 3.1 من هذه الأداة لوقت تشغيل .NET Core 3.1 Lambda القادم. يمكن تتبع العمل الخاص بذلك في نموذج الاختبار النموذجي 31 .

في هذا الإصدار ، أستخدم AssemblyDependencyResolver الذي تمت إضافته في .NET Core 3.0 لتحميل وظيفة 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.

هذا ما أملكه الآن حتى تعمل أداة Mock الخاصة بي.
image

فقط لتذكير بعض الحقائق حول هذه القضية.

  • يجمع المشروع مع عدم وجود أخطاء
  • اختبار المشروع يعمل بنجاح
  • لا تعمل أداة Mock عند تنفيذ التعليمات البرمجية التي تستخدم ملف 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 اليوم لكل من .NET Core 2.1 و .NET Core 3.1 والذي يقوم الآن بتحميل رمز Lambda في AssemblyLoadContext منفصل. أعتقد أن هذا سيصلح الكثير من المشكلات المبلغ عنها هنا. سأغلق هذه القضية لأنها قديمة وأعتقد أن هناك عدة قضايا منفصلة. بعد استخدام الإصدار الجديد في حالة استمرار وجود مشكلة ، يرجى فتح مشكلة منفصلة لتسهيل تتبعها.

شكرًا normj وتهانينا ، سأختبر

تضمين التغريدة
مرحبا. عانيت من نفس المشكلات منذ 6 أيام. حاولت تغطية جميع المعلومات التي كانت لدي في آخر مشاركة في هذا الموضوع. لا أعتقد أن هذه المشكلة قد تم حلها حتى الآن حتى حصلنا على دليل.

هل قمت باختبار 3.1؟

Edulopez هل جربت الإصدار الأخير الذي صدر بالأمس؟ إذا كانت المشكلة لا تزال قائمة ، فالرجاء إنشاء مشكلة منفصلة في الريبو الخاص بك. لقد شعرت للتو أن هذا الخيط قد أصبح صعبًا وأظن أنه سيتم إصلاح العديد من المشكلات المبلغ عنها مع الإصدار الجديد.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

matheusmaximo picture matheusmaximo  ·  7تعليقات

ibuchan72390 picture ibuchan72390  ·  7تعليقات

pandaedward picture pandaedward  ·  6تعليقات

rv-dtomaz picture rv-dtomaz  ·  6تعليقات

JustinGrote picture JustinGrote  ·  5تعليقات