Win64Windows Vista.NET 1.0DBAWindows 2003Win32.NET 1.1XAML.NET 3.0Windows 2000设计 / 图形Windows XP.NET 2.0.NET 3.5C# 2.0初学者C# 3.0WPF开发Windows.NETC#
动态加载变得简单






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

引言
动态加载是在运行时加载代码并使用它,而不是在编译时。 为什么要使用它? 简单来说,动态加载使修改程序和稍后添加额外功能变得更容易(尤其是由第三方供应商)。 此外,它使大型项目更易于管理,因为每个代码功能部分彼此独立。 许多应用程序使用此技术来实现插件,例如 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
要使用代码,必须采取以下步骤;
- 创建一个需要动态加载支持的应用程序
- 创建一个新的类库 (dll),其中包含所有插件将支持的接口的副本
- 从应用程序到接口库创建一个显式链接
- 创建包含实现接口的类的新的类库 (dll)
- 将包含的代码添加到应用程序中
- 在应用程序的加载期间调用 LoadAssemblies; 使用 dll 的路径和接口的完全限定名称(例如 DNBSoft.InterfaceA)。
- 对每个返回的对象(一旦作为 List<object> 返回,则转换为接口)调用相关方法,以将插件链接到应用程序。
关注点
在编写代码时,你学到了任何有趣/有趣/烦人的东西吗? 你做过任何特别聪明、狂野或古怪的事情吗? 没有,也没有,但是插件支持非常有用,一旦你掌握了它,你就会经常使用它。
这就是未来!!!
历史
版本 1.0.0.0 - 唯一的一次发布