65.9K
CodeProject 正在变化。 阅读更多。
Home

动态加载变得简单

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.90/5 (10投票s)

2008年3月24日

CPOL

2分钟阅读

viewsIcon

47225

downloadIcon

288

一篇演示动态加载有多么容易的文章(以及为什么你应该使用它)。

引言

动态加载是在运行时加载代码并使用它,而不是在编译时。 为什么要使用它? 简单来说,动态加载使修改程序和稍后添加额外功能变得更容易(尤其是由第三方供应商)。 此外,它使大型项目更易于管理,因为每个代码功能部分彼此独立。 许多应用程序使用此技术来实现插件,例如 Visual Studio 和 CIRIP(参见演示链接)。

包含的源代码显示了如何根据特定接口从 dll 文件(动态链接库)加载类。

代码

public static List<object> LoadAssemblies(String path, String interfaceName, bool recursive)
{
    List<object> output = new List<object>();

    String[] files = new String[0];
    if (recursive)
    {
        files = Directory.GetFiles(path, "*.dll", SearchOption.AllDirectories);
    }
    else
    {
        files = Directory.GetFiles(path, "*.dll", SearchOption.TopDirectoryOnly);
    }

    foreach (String filename in files)
    {
        Console.WriteLine("Loading " + filename);
        try
        {
            Assembly assembly = Assembly.LoadFrom(filename);

            foreach (Type t in assembly.GetTypes())
            {
                if (t.IsClass && !t.IsAbstract && t.GetInterface(interfaceName) != null)
                {
                    output.Add(Activator.CreateInstance(t));
                }
            }
        }
        catch (Exception err)
        {
            Console.WriteLine("Loading fail:" + err.ToString());
        }
        finally
        {
            Console.WriteLine("Loading complete");
        }
    }

    return output;
}

LoadAssemblies 方法加载在路径中(或在更深层的文件夹中,如果指定了 recursive = true)找到的 dll 文件中实现 interfaceName 的每个类的单个实例。

Using the Code

要使用代码,必须采取以下步骤;

  1. 创建一个需要动态加载支持的应用程序
  2. 创建一个新的类库 (dll),其中包含所有插件将支持的接口的副本
  3. 从应用程序到接口库创建一个显式链接
  4. 创建包含实现接口的类的新的类库 (dll)
  5. 将包含的代码添加到应用程序中
  6. 在应用程序的加载期间调用 LoadAssemblies; 使用 dll 的路径和接口的完全限定名称(例如 DNBSoft.InterfaceA)。
  7. 对每个返回的对象(一旦作为 List<object> 返回,则转换为接口)调用相关方法,以将插件链接到应用程序。

关注点

在编写代码时,你学到了任何有趣/有趣/烦人的东西吗? 你做过任何特别聪明、狂野或古怪的事情吗? 没有,也没有,但是插件支持非常有用,一旦你掌握了它,你就会经常使用它。

这就是未来!!!

历史

版本 1.0.0.0 - 唯一的一次发布

© . All rights reserved.