从远程程序集加载接口
本文关键字:加载 接口 程序集 | 更新日期: 2023-09-27 18:25:54
我目前正在开发客户端-服务器应用程序。它应该从模块加载接口,并在自己的窗口中显示它们。但有时我需要插件远程模块。我可以在不在磁盘上加载模块文件的情况下从模块运行表单(所有操作都有效)吗?非常感谢。
是的,你可以加载从远程计算机发送的程序集(我不会在这里讨论这对安全的影响,我至少会检查签名):
var data = new WebClient.DownloadData(url); // For example...
var assembly = Assembly.Load(data);
在C++/CLI中(您的问题中不清楚您使用的是什么语言):
array<Byte>^ data = (gcnew WebClient())->DownloadData(url);
Assembly^ assembly = Assembly::Load(data);
现在你有了汇编,你可以从中加载一些东西,例如(只是为了说明):
var plugins = assembly.GetExportedTypes()
.Where(x => typeof(IYourContract).IsAssignableFrom(x) && !x.IsAbstract)
.Select(x => (IYourContract)Activator.CreateInstance(x));
请注意,这是一个非常幼稚的实现,因为每个实例都是不同的(如果您多次加载同一个插件),而且它在资源(主内存)方面也是可扩展的。您应该保留一个程序集缓存:
private static Dictionary<string, Assembly> _cachedAssemblies =
new Dictionary<string, Assembly>();
public static Assembly LoadRemoteAssembly(string url)
{
lock (_cachedAssemblies)
{
if (_cachedAssemblies.ContainsKey(url))
return _cachedAssemblies[url];
var data = new WebClient.DownloadData(url); // For example...
var assembly = Assembly.Load(data);
_cachedAssemblies.Add(url, assembly);
return assembly;
}
}