2010-01-25 4 views
3

회사의 내부 비즈니스 시스템을위한 플러그인 아키텍처를 실험하고 있습니다. 특정 인터페이스를 구현하는 플러그인 폴더에서 모든 .DLL을 읽을 수있었습니다. 내가 알아 내려고하는 것은 "호스트"MDI 부모 응용 프로그램과 MDI 자식을 만들려는 .DLL에 포함될 양식 사이의 최선의 통신 방법입니다.플러그인 아키텍처 - DLL에있는 어린이를 인식하는 MDI 부모 형식 만들기

현재 MDI 상위에 추가 할 .DLL에서 ToolStripMenuItem 개체 만 반환합니다. 또한 .DLL에서 ToolStripMenuItems로 연결된 이벤트가 .DLL의 코드로 전파되는지 테스트했습니다. 또한 인터페이스를 통해 Form 객체를 반환하고 플러그인 폴더가 "스캔 됨"이므로 해당 양식을 열었습니다.

그러나 이러한 양식 MDI 자녀를 어떻게 만들 것인지 명확하지 않습니다. 또한 .DLLs에 거주하는 다른 양식도 MDI 자녀 여야합니다. VS 2008 Addin 프로젝트를 작성하여 무슨 일이 진행되고 있는지, Addin이 ToolStripMenuItems에 추가하고 다른 작업을 수행하는 Application 개체를 허용하는 것으로 보입니다. .DLL 안에 메뉴를 빌드하는 코드. 이것은 MDI가 각 .DLL에서 ToolStripMenuItem을 요청하고 반환 된 개체를 자체 메뉴에 추가하는 지금까지 해본 것과는 정반대입니다.

응용 프로그램 개체를 동일한 방식으로 수락하도록 내 플러그인 아키텍처를 설계하면 MDI 자식으로 열 수있는 유일한 방법이 있습니까? .DLL에 응용 프로그램 개체를 전달하지 않음으로써 두통이 나에게 알려지지 않은 다른 것을 요청하고 있습니까?

+0

나는 비슷한 것을하고 싶어합니다. 이거 작동시켜 봤어? 호스트 양식에서 폴더를 모니터하는 방법을 모르는 상태에서 플러그 인을 추가하기위한 올바른 인터페이스를 확인하는 방법을 알았습니다. 코드에 대한 링크가 없다면 게시 하시겠습니까? 그런 다음 어떻게 작동하는지 샘플 코드를 작성 하시겠습니까? –

답변

4

수년 전에 우리는 비슷한 것을했습니다. 우리가 처리 한 방법은 PluginManager와 Plugins에 의해 구현 된 두 개의 인터페이스를 작성하는 것이 었습니다. 앱을 시작

''' <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 

되면, 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 

플러그인은이 인터페이스를 구현 :

플러그인 관리자는이 유사한 인터페이스를 구현 이미이 작업을 수행 한 것처럼) 각 플러그인을 인스턴스화하여 각 플러그인과 함께 등록합니다. 그러면 PluginManager가 플러그인을 초기화한 다음 실행합니다.

플러그인 측면에서 Plugin이 Initialized 또는 Run (필요에 따라 다름) 인 경우 플러그인 양식의 MDIParent 속성을 IPluginManager 인터페이스에 제공된 MDIForm으로 설정하기 만하면됩니다. 그리고 비올라!

당신이 쉽게 변경하거나 확장 할 수있는 둘 사이의 매우 간단한 계약입니다.

+0

인터페이스를 구현하는 하위 폼의 예를 게시 하시겠습니까? –

관련 문제