Я занимаюсь разработкой лямбда-функций c # с использованием Visual Studio 2017, набора инструментов AWS для VS2017 и шаблона AWS Lambda Project .Net Core 2.0.Я успешно разработал и развернул несколько функций.Я разработал функцию, которая использует Aspose.Net версии 18.5.Функция выполняется, как и ожидалось, при тестировании на моем компьютере с Windows.Однако при развертывании на AWS Lambda я получаю следующую трассировку стека:
One or more errors occurred. (The type initializer for 'Gdip' threw an exception.): AggregateException
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at lambda_method(Closure , Stream , Stream , LambdaContextInternal )
at System.Drawing.SafeNativeMethods.Gdip.GdipCreateMatrix2(Single m11, Single m12, Single m21, Single m22, Single dx, Single dy, IntPtr& matrix)
at \u0006 .\u0002(Single \u0002, Single \u0003, Single \u0005, Single , Single \u0006, Single \u000e, \u000e \u000f)
at .\u0002(\u0005 \u0002, \u000f \u0003, \u000e \u0005, Single , Single \u0006, Boolean \u000e, Int32 \u000f, Boolean \u0002 , Double& \u0003 , Double& \u0005 , \u0002 & )
at ..ctor(\u000f \u0002, \u0005 \u0003, \u000f \u0005)
at \u0002 .\u000f \u0002(\u000f \u0002, \u0005 \u0003, \u000f \u0005, & )
at \u0006 .\u0002( & \u0002)
at Aspose.Pdf.Devices.ImageDevice.\u0002(Page \u0002)
at Aspose.Pdf.Devices.PngDevice.Process(Page page, Stream output)
at CreateImagesFromPDF.Function.<FunctionHandler>d__10.MoveNext() in C:\Users\Thomas\source\repos\CreateImagesFromPDF\CreateImagesFromPDF\Function.cs:line 156
Unable to load DLL 'libdl': The specified module or one of its dependencies could not be found.
(Exception from HRESULT: 0x8007007E): DllNotFoundException
at Interop.Libdl.dlopen(String fileName, Int32 flag)
at System.Drawing.SafeNativeMethods.Gdip.LoadNativeLibrary()
at System.Drawing.SafeNativeMethods.Gdip..cctor()
Ключевое сообщение здесь выглядит так: «Невозможно загрузить DLL« libdl ». Исследуя обнаруженную проблему, Aspose зависит от системы.Drawing.Common, который зависит от libdl.dll в Windows и libdl.so в Linux (где исполняется Lambda). По-видимому, в некоторых дистрибутивах Linux это библиотека libdl.so.2. Если бы это было обычное приложение, неЛямбда-функция, ответ, по-видимому, заключается в создании символической ссылки из libdl.so.2 на libdl.so. К сожалению, я не верю, что это доступно для меня с Lambda. Если бы я создавал свой пакет Lambda в Linux,Я бы включил в пакет libdl.so.2, переименованный в libdl.so, но я создаю пакет с помощью AWS Toolkit и не знаю, как мне добавить в него эту библиотеку. Любая помощь, которую я могу получить в этой проблемебудет признателен.
Вот мой исходный код:
using (GetObjectResponse response = await S3Client.GetObjectAsync(request))
{
using (Stream responseStream = response.ResponseStream)
{
using (MemoryStream ms = new MemoryStream())
{
responseStream.CopyTo(ms);
using (Document doc = new Document(ms))
{
for (int i = 0; i < doc.Pages.Count; i++)
{
string outFile = fileName + "_" + (i + 1).ToString() + ".png";
string tmpFile = "/tmp/" + outFile;
Page page = doc.Pages[i + 1];
using (FileStream imageStream = new FileStream(tmpFile, FileMode.Create))
{
PngDevice pngDevice;
pngDevice = new PngDevice(Convert.ToInt32((double)page.Rect.Width * 4.17), Convert.ToInt32((double)page.Rect.Height * 4.17));
pngDevice.Process(page, imageStream);
imageStream.Close();
var putRequest = new PutObjectRequest
{
BucketName = s3Event.Bucket.Name,
Key = newFolder + outFile,
ContentType = "image/png",
FilePath = tmpFile
};
PutObjectResponse resp = await S3Client.PutObjectAsync(putRequest);
File.Delete(tmpFile);
}
}
}
}
}
}
Код не выполняется в строке "pngDevice.Process (page, imageStream);".