0

私はプラグインベースのアプリケーションを書いています。

ホスト アプリケーション:

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 でいくつかのメソッドを実行したいと考えています。もちろん、多くのプラグインがあり、すべてのプラグインに特定のメソッドが含まれているわけではありません。イベントを使用しようとしましたが、成功しませんでした。それを行う方法はありますか?

4

1 に答える 1

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);
}

プラグイン クラス:

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ます。もちろん、必要な場所にイベントを配置できます。プラグインが EventHandler を割り当てられるように、プラグインでイベントを使用できるようにする必要があります。

于 2013-04-22T10:27:01.553 に答える