4

不确定此处使用的确切术语,因此将不胜感激。

最简单的是,我有一个表单应用程序。当我加载“form.exe”时,表单有一个控件,一个菜单。此菜单有一个菜单项“退出”。我想要的是,在加载表单时,能够将参数传递给这个表单应用程序,这些应用程序指定可以添加专门方法、控件等的 DLL。

现在,当我加载“form.exe add_plugable.dll”时,我的菜单有另一个菜单项“添加”。当我加载“form.exe add_plugable.dll remove_pluggable.dll”时,菜单有 3 个项目“退出”、“添加”和“删除”。

希望这是有道理的。我需要在 Forms 应用程序中包含什么以及如何创建我的 DLL?我知道我需要一个通用接口,但不知道如何使用命名空间、接口和抽象类来实现这一点。

谢谢!

4

2 回答 2

6

我建议查看Managed Extensibility Framework。它是为这种确切类型的场景而设计的。

例如,Visual Studio 使用它的可扩展性,因此可以在运行时动态发现和插入插件。

于 2012-10-05T17:16:37.720 回答
5

您可以使用预先编写的框架,但如果您正在寻找“基本”解决方案,请尝试以下操作:

  1. 创建一个接口(或一组接口,如果您愿意),其中包含表单应用程序将调用的所有方法,例如IPlugin. 将接口放在单独的类库中。
  2. 在每个插件 DLL 中,创建一个实现IPlugin.
  3. 在表单应用程序中,决定加载哪些插件以及何时调用它们。这个逻辑完全取决于你。

像这样加载一个插件,然后调用接口成员来完成你想要的。app.config您可以根据您的要求从数据库中读取插件文件和类名,或通过命名约定计算它们。

var pluginAssembly = Assembly.Load(pluginFileName);
var plugin = (IPlugin) pluginAssembly.CreateInstance(pluginClassName);

这些方法有几个重载,允许对过程进行更多控制。例如,您可以使用AssemblyName而不是简单的字符串来加载插件程序集。实例化类时,您可以指定绑定标志和一组参数值以传递给类的构造函数。

于 2012-10-05T17:49:44.020 回答