我的目标是有一个动态框架,在那里我可以在外部构建库(DLL),并将它们放在一个S3桶中。在所需的执行时,Lambda函数必须有某种方法从s3桶加载DLL并实例化它。带有.NET核心2.0+的AWS支持此特性吗?我没有找到很多关于同样的文件。
请请求指点
发布于 2018-06-21 08:25:56
有.NET核心2.0+的AWS吗?
是。它实际上与AWS无关,您可以在AWS中这样做,就像在加载“插件风格”运行时DLL的任何.NET核心应用程序中一样。
首先,将所需的DLL从S3复制到本地磁盘。在AWS中,唯一可以编写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 .NET 4+相比,4+内核有了很大的变化。加载程序集:
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();
https://stackoverflow.com/questions/50960421
复制相似问题