2013-04-22 4 views
0

Я пишу приложение на основе плагина.C# Связь между плагином и хост-приложением

Хост приложения:

namespace CSK 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 

    public MainWindow() 
    {     
     InitializeComponent(); 
     LoadPlugins(); 

    } 

    public void LoadPlugins() 
    { 
     DirectoryInfo di = new DirectoryInfo("./Plugins"); 

     foreach (FileInfo fi in di.GetFiles("*_Plugin.dll")) 
     { 
      Assembly pluginAssembly = Assembly.LoadFrom(fi.FullName); 

      foreach (Type pluginType in pluginAssembly.GetExportedTypes()) 
      { 

       if (pluginType.GetInterface(typeof(MainInterface.PluginHostInterface).Name) != null) 
       { 
        MainInterface.PluginHostInterface TypeLoadedFromPlugin = (MainInterface.PluginHostInterface)Activator.CreateInstance(pluginType); 
        MainInterface.IMother mother = new ApiMethods(this); 
        TypeLoadedFromPlugin.Initialize(mother); 
       } 

      } 
     } 
    } 
} 

Интерфейс:

namespace MainInterface 
{ 
public interface PluginHostInterface 
{ 
    void Initialize(IMother mother); 
} 

public interface IMother 
{ 
    MenuItem addMenuItem(String header, String name); 
    MenuItem addSubMenuItem(MenuItem menu, String header, String name); 
    Boolean receiveMessage(String message, String from); 
    Boolean addContact(String name, String status, String proto, String avatar = "av"); 
} 
} 

Тест плагин:

namespace Plugin_Test 
{ 
public class MainClass : MainInterface.PluginHostInterface 
{ 
    private MainInterface.IMother CSK; 

    public void Initialize(MainInterface.IMother mainAppHandler) 
    { 
     CSK = mainAppHandler; 

    } 

} 
} 

А теперь я хочу, чтобы выполнить некоторые методы в Plugin Test из приложения хоста. Конечно, будет много плагинов, и не каждый из них будет содержать указанные методы. Я пытался использовать события, но безуспешно. Есть идеи, как это сделать?

+0

'TypeLoadedFromPlugin.Initialize (mother);' <- you выполняют функцию плагина из приложения-хозяина прямо здесь. Какова ваша проблема? – x4rf41

+0

Я хочу выполнять функции из плагина, например, щелчком мыши, а не по загрузке. И если я реализую новый метод в интерфейсе PluginHostInterface, я должен реализовать те же методы в каждом плагине. – jankes83

+0

btw. используйте абстрактные классы вместо интерфейсов, если вы не хотите внедрять каждый метод, находящийся в интерфейсе. – x4rf41

ответ

1

Класс с событиями:

public class EventProvidingClass { 

    public event EventHandler SomeEvent; 

    public void InvokeSomeEvent() { 
     if(SomeEvent != null) SomeEvent.Invoke(this, new EventArgs()); 
    } 

} 

Ваш плагин Интерфейс:

public interface PluginHostInterface 
{ 
    void Initialize(IMother mother); 
    void InitializeEvents(EventProvidingClass eventProvider); 
} 

Plugin Класс:

public class MainClass : MainInterface.PluginHostInterface 
{ 
    private MainInterface.IMother CSK; 

    public void Initialize(MainInterface.IMother mainAppHandler) 
    { 
     CSK = mainAppHandler; 
    } 

    public void InitializeEvents(EventProvidingClass eventProvider) 
    { 
     eventProvider.SomeEvent += someEventHandler; 
    } 

    private void someEventHandler(object sender, EventArgs e) 
    { 

    } 
} 

, а затем вызвать InitializeEvents после функции Initialize. Конечно, вы можете разместить события там, где они вам нужны, вам просто нужно убедиться, что вы сделаете их доступными для плагина, чтобы плагин мог назначить его EventHandlers.

Смежные вопросы