从远程程序集加载接口

本文关键字:加载 接口 程序集 | 更新日期: 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;
    }
}