.net 插件体系结构-使MDI父窗体了解DLL中的子窗体

.net 插件体系结构-使MDI父窗体了解DLL中的子窗体,.net,vb.net,plugins,architecture,.net,Vb.net,Plugins,Architecture,我正在为我公司的内部业务系统试验一种插件架构。我已经设法读取了插件文件夹中的所有.dll文件,这些文件实现了一个特定的接口。我试图找出的是“主机”MDI父应用程序和将在.dll中生成MDI子级的表单之间的最佳通信方法 目前,我只返回.dll中的ToolStripMenuItem对象以添加到MDI父对象。我还测试了.dll中连接到ToolStripMenuItems的事件是否会传播到.dll中的代码。我还设法通过界面返回一个表单对象并打开该表单,因为插件文件夹正在被“扫描” 然而,我不清楚我将如何

我正在为我公司的内部业务系统试验一种插件架构。我已经设法读取了插件文件夹中的所有.dll文件,这些文件实现了一个特定的接口。我试图找出的是“主机”MDI父应用程序和将在.dll中生成MDI子级的表单之间的最佳通信方法

目前,我只返回.dll中的ToolStripMenuItem对象以添加到MDI父对象。我还测试了.dll中连接到ToolStripMenuItems的事件是否会传播到.dll中的代码。我还设法通过界面返回一个表单对象并打开该表单,因为插件文件夹正在被“扫描”

然而,我不清楚我将如何使这些表格MDI儿童。此外,生活在.dll中的任何其他形式也必须是MDI儿童。我创建了一个VS 2008加载项项目,只是为了看看发生了什么,加载项似乎接受了一个应用程序对象,它在该对象上添加到ToolStripMenuItems并执行其他操作。在.DLL中构建菜单的代码。这与我到目前为止所做的相反,MDI从每个.DLL请求ToolStripMenuItem,并将返回的对象添加到它自己的菜单中


设计我的插件体系结构以同样的方式接受应用程序对象,这是我将表单作为MDI子级打开的唯一方法吗?我是不是想通过不将应用程序对象传递到.DLL来寻求其他我目前不知道的令人头痛的问题?

几年前,我们做了类似的事情。我们是如何处理它的,我们创建了几个接口,这些接口由一个PluginManager和插件实现

插件管理器实现了一个类似于以下内容的界面:

    ''' <summary>
'''The IPluginManager interface is implemented by whatever component manages your gui
'''It provides a means for plugins to access GUI elements of the application
''' </summary>
Public Interface IPluginManager

    ''' <summary>
    '''The MDIForm property allows the plugin to display itself
    '''inside of the application's main MDI form (ie.  plugin.form.mdiparent=mdiform)
    ''' </summary>
    ReadOnly Property MDIForm() As Form
    ReadOnly Property Toolbar() As ToolBar

    ''' <summary>
    '''Allows the plugin to request that the application's main menu be updated
    ''' </summary>
    ''' <param name="Menu">The menu to add to the main menu</param>
    Sub UpdateMainMenu(ByVal Menu As Menu)

    ''' <summary>
    '''Allows the plugin to request that the application's workspace toolbar be updated
    ''' </summary>
    ''' <param name="Buttons">the collection of toolbar buttons to add to the toolbar</param>
    Sub UpdateToolbarButtons(ByVal Buttons As ToolBar.ToolBarButtonCollection)

End Interface
“”
''IPluginManager接口由管理gui的任何组件实现
''它为插件提供了访问应用程序GUI元素的方法
''' 
公共接口IPluginManager
''' 
''MDIForm属性允许插件显示自身
在应用程序的主MDI表单内部(即plugin.form.mdipern=mdiform)
''' 
只读属性MDIForm()作为表单
只读属性工具栏()作为工具栏
''' 
''允许插件请求更新应用程序的主菜单
''' 
''要添加到主菜单的菜单
子更新主菜单(ByVal菜单作为菜单)
''' 
''允许插件请求更新应用程序的工作区工具栏
''' 
''要添加到工具栏的工具栏按钮集合
子更新ToolBarButtons(作为工具栏的ByVal按钮。ToolBarButtonCollection)
端接口
插件实现了这个接口:

    ''' <summary>
'''The IPlugin interface is implemented by all plugins
'''It provides a standardized means for the pluginmanager
'''to communicate with a plugin, without knowing the plugin explicitly
''' </summary>
Public Interface IPlugin

    ''' <summary>
    '''Allows the plugin to be intialized first before it asked to run
    ''' </summary>
    Sub Initialize()

    ''' <summary>
    '''Allows the pluginmanager to register itself with the plugin
    '''so the plugin can listen to events from the pluginmanager
    ''' </summary>
    ''' <param name="PluginManager">A plugin manager that implements the IPluginManager interface</param>
    Sub RegisterPluginManager(ByVal PluginManager As IPluginManager)

    ''' <summary>
    '''Requests the plugin to run its functionality
    ''' </summary>
    Sub Run()

End Interface
“”
''IPlugin接口由所有插件实现
''它为pluginmanager提供了一种标准化的方法
''与插件通信,而不明确了解插件
''' 
公共接口IPlugin
''' 
''允许在请求运行插件之前先初始化插件
''' 
子初始化()
''' 
''允许pluginmanager向插件注册自身
''因此插件可以侦听来自pluginmanager的事件
''' 
''实现IPluginManager接口的插件管理器
子注册器PluginManager(由Val PluginManager作为IPluginManager)
''' 
''请求插件运行其功能
''' 
次级运行()
端接口
应用程序启动后,PluginManager会找到所有可用的插件(听起来你已经有了这个功能),然后实例化每个插件,并向每个插件注册自己。然后,PluginManager初始化并运行插件

在插件方面,当插件初始化或运行时(取决于您的需要),您只需将插件表单的MDIParent属性设置为IPluginManager界面中提供的MDIForm。还有维奥拉


这是两者之间的一个非常简单的合同,您可以轻松地更改或扩展。

我对做类似的事情很感兴趣。你有没有让它工作过?我不知道如何让宿主窗体监视文件夹,一旦它这样做了,如何让它检查添加插件的正确接口。如果不是代码的链接,那么您是否介意发布一些示例代码来说明如何实现该接口?您是否介意发布实现该接口的子表单的示例?