c#插件事件处理

我编写了一个使用接口的插件系统,并且满足此合同的任何插件都在运行时加载到主系统中。

插件有效地返回插入主应用程序的TabPage,并从插件dll中进行控制。

如果插件中发生错误,则会显示标准Windows错误消息。 我想要做的是创建一个返回错误消息的事件,以便我可以在我为文本保留的区域中显示它。

我是否需要跟踪所有连接的插件/接口实例,以便能够设置一个事件来监控每个实例?

目前,我的系统循环遍历app文件夹中的dll,并且那些满足接口契约的dll被加载,每次控件被丢弃时,接口的实际实例被丢弃,然后通过加载的按钮事件将其移交给dll。 TabPage并在插件中处理。

我希望这一切都有道理。

您不需要保留对插件类的引用,只需在启动时向事件添加委托,之后您不再需要引用。

您可以在插件合约中添加一个事件:

public interface IPlugin { event EventHandler Error; void Initialise(); } 

这样,任何主机都可以在插件中发生错误时订阅该事件:

 public class MyPlugin : IPlugin { public event EventHandler Error; public void Initialise() { try { } catch (Exception e) { OnError(new ErrorEventArgs(e)); } } protected void OnError(ErrorEventArgs e) { var ev = Error; if (ev != null) ev(this, e); } } 

如果我跟着你正确发布,这就是我要去做的方法。

在插件界面(让我们说IPlugin),你需要声明一个事件。

 public delegate void ShowErrorEventHandler(string errorMessage); public interface IPlugin { event ShowErrorEventHandler ShowError; } 

然后当你加载你的插件时,每个插件只需订阅它的ShowError事件,例如:

 ... foreach(var plugin in plugins) { plugin.ShowError += MainForm_ShowError; } ... private void MainForm_ShowError(string errorMessage) { // Do something with the error... stick it in your reserved area txtReservedArea.Text = errorMessage; } 

希望这可以帮助