C# 如何在c中创建可插入的GUI和DLL#

C# 如何在c中创建可插入的GUI和DLL#,c#,winforms,pluggable,C#,Winforms,Pluggable,不确定这里使用的确切术语,因此,如果您有任何帮助,我们将不胜感激 最简单的是,我有一个表单应用程序。当我加载“form.exe”时,表单有一个控件,一个菜单。此菜单有一个菜单项“退出”。我想要的是,在加载表单时,能够将参数传递给这个表单应用程序,这些参数指定可以添加专门方法、控件等的DLL 现在,当我加载“form.exe add_plugable.dll”时,我的菜单中有另一个菜单项“add”。 当我加载“form.exe add_plugable.dll remove_plugable.dl

不确定这里使用的确切术语,因此,如果您有任何帮助,我们将不胜感激

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

现在,当我加载“form.exe add_plugable.dll”时,我的菜单中有另一个菜单项“add”。 当我加载“form.exe add_plugable.dll remove_plugable.dll”时,菜单有3项“Exit”、“add”和“remove”

希望这是有意义的。我需要在表单应用程序中包括什么?如何创建DLL?我知道我需要一个公共接口,但不知道如何通过名称空间、接口和抽象类来实现这一点


谢谢

我建议您调查一下。它就是为这种情况而设计的


例如,它是Visual Studio用于扩展的,因此可以在运行时动态发现和插入外接程序。

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

  • 创建一个包含表单应用程序将调用的所有方法的接口(或一组接口,如果愿意),例如
    IPlugin
    。将接口放在单独的类库中
  • 在每个插件DLL中,创建一个实现
    IPlugin
    的公共类
  • 在forms应用程序中,决定加载哪些插件以及何时调用它们。这个逻辑完全取决于你
  • 像这样加载一个插件,然后调用接口成员来完成你想要的。您可以从数据库
    app.config
    读取插件文件和类名,或者根据您的要求通过命名约定计算它们

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

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

    这可能是我升级到VS 2010时的解决方案。然而,我目前正在2008年使用.NET3.5。@Tizz从CodePlex站点获取它。在.NET3.5中非常有效:我也发现了这个教程(添加以供参考):非常有用。但愿我能不止一次地投票支持这一点。一个问题。这是否允许我简单地将一个新的DLL(包含一个实现
    IPlugin
    的类)放到应用程序目录中,并让我的应用程序在下次加载时自动发现它?由于新的插件DLL将在以后添加到目录中,因此我没有您上面提到的
    pluginClassName
    参数的值。如何解决这个问题?以及如何知道特定DLL是否包含实现
    IPlugin
    程序集的类。Load
    只会在首次调用DLL时发现它,因此您可以在尝试加载DLL之前随时将其放入目录中。加载后,程序集将在AppDomain的生命周期内缓存在内存中。要刷新缓存,请回收AppDomain。要在不事先知道插件类名称的情况下发现插件类,需要您自己编写相应的逻辑。例如,您可以使用反射来查找程序集中实现插件接口的所有公共类。谢谢Chris。这就是我的结局。