AWS Lambda (C#) 是否允许从 s3 存储桶动态加载 DLL 并将其实例化以在 Lambda 函数中使用?



我的目标是拥有一个动态框架,我可以在其中从外部构建库(DLL(并将它们放置在S3存储桶中。在所需的执行时间,Lambda 函数必须有某种方式从 s3 存储桶加载 DLL 并将其实例化。具有 .NET Core 2.0+ 的 AWS 是否支持此功能?我没有找到太多关于相同的文档。

请请求指针

AWS 是否具有 .NET Core 2.0+

是的。它实际上与AWS无关,您可以在AWS Lambda中执行此操作,就像在任何具有"插件样式"运行时DLL加载的.NET Core应用程序中执行此操作一样。

首先,将所需的 DLL 从 S3 复制到本地磁盘。在 AWS Lambda 中,唯一可以写入 DLL 文件的地方是/tmp,但通常最好只调用System.IO.Path.GetTempPath()而不是硬编码路径。

var dllPath= Path.Combine(Path.GetTempPath(), "name-of-your.dll");
var request = new GetObjectRequest
{
BucketName = "name-of-your-bucket",
Key = "name-of-your-dll-in-S3"
};
using (var response = await S3.GetObjectAsync(request))
{
await response.WriteResponseStreamToFileAsync(dllPath, false);
}

或者如果您愿意,可以使用TransferUtility

现在是棘手的部分。与.NET 4+相比,.NET Core发生了很大变化。加载程序集:

var assembly = AssemblyLoadContext.GetLoadContext(typeof(ISomeInterface).GetTypeInfo().Assembly).LoadFromAssemblyPath(dllPath);

显然,您的 DLL 应该包含一个实现ISomeInterface的类。在程序集内查找实现此接口的类。一种方法是执行此操作:

var type = typeof(ISomeInterface);
var types = assembly.GetTypes().Where(t =>
type.IsAssignableFrom(t) &&
t.GetTypeInfo().IsClass &&
!t.GetTypeInfo().IsAbstract);
var targetType = types.Single();

创建类的实例:

var instance = (ISomeInterface)Activator.CreateInstance(targetType);

最后,像往常一样使用它:

instance.SomeMethod();

最新更新