the*_*rid 1 c# dll dynamic amazon-web-services aws-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);
}
Run Code Online (Sandbox Code Playgroud)
或者TransferUtility如果您愿意也可以使用。
现在是棘手的部分。与 .NET 4+ 相比,.NET Core 发生了很多变化。加载程序集:
var assembly = AssemblyLoadContext.GetLoadContext(typeof(ISomeInterface).GetTypeInfo().Assembly).LoadFromAssemblyPath(dllPath);
Run Code Online (Sandbox Code Playgroud)
显然,您的 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();
Run Code Online (Sandbox Code Playgroud)
创建类的实例:
var instance = (ISomeInterface)Activator.CreateInstance(targetType);
Run Code Online (Sandbox Code Playgroud)
最后,照常使用它:
instance.SomeMethod();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3092 次 |
| 最近记录: |