首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWS (C#)允许动态地从s3桶加载DLL并实例化它以便在Lambda函数中使用吗?

AWS (C#)允许动态地从s3桶加载DLL并实例化它以便在Lambda函数中使用吗?
EN

Stack Overflow用户
提问于 2018-06-21 04:30:43
回答 1查看 2.5K关注 0票数 1

我的目标是有一个动态框架,在那里我可以在外部构建库(DLL),并将它们放在一个S3桶中。在所需的执行时,Lambda函数必须有某种方法从s3桶加载DLL并实例化它。带有.NET核心2.0+的AWS支持此特性吗?我没有找到很多关于同样的文件。

请请求指点

EN

Stack Overflow用户

回答已采纳

发布于 2018-06-21 08:25:56

有.NET核心2.0+的AWS吗?

是。它实际上与AWS无关,您可以在AWS中这样做,就像在加载“插件风格”运行时DLL的任何.NET核心应用程序中一样。

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

代码语言:javascript
运行
复制
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 .NET 4+相比,4+内核有了很大的变化。加载程序集:

代码语言:javascript
运行
复制
var assembly = AssemblyLoadContext.GetLoadContext(typeof(ISomeInterface).GetTypeInfo().Assembly).LoadFromAssemblyPath(dllPath);

显然,DLL应该包含一个实现ISomeInterface的类。在程序集中查找实现此接口的类。这样做的一个方法是:

代码语言:javascript
运行
复制
var type = typeof(ISomeInterface);
var types = assembly.GetTypes().Where(t =>
                type.IsAssignableFrom(t) &&
                t.GetTypeInfo().IsClass &&
                !t.GetTypeInfo().IsAbstract);
var targetType = types.Single();

创建类的实例:

代码语言:javascript
运行
复制
var instance = (ISomeInterface)Activator.CreateInstance(targetType);

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

代码语言:javascript
运行
复制
instance.SomeMethod();
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50960421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档