我是一名初学C#程序员,刚刚进入插件的高级世界。
我目前拥有的内容:我有一个基础架构,用于提供GUI,函数和类,并且其他插件可以访问GUI,函数和类的每个实例。 (例如,如果一个插件(插件a)的状态因用户已更改而发生更改,则可以将插件b中的标签中的文本更改为新用户名。)
我想要努力工作:总之一句话。活动。如果插件a有一个事件,我希望插件b能够订阅它。我正在使用通用事件处理程序委托,但它不想订阅。
我已经看过的资源: http://www.dreamincode.net/forums/topic/78974-using-reflection-to-load-unreferenced-assemblies-at-runtime/ - 非常有用
Firing events within a plug-in architecture vs single application
问题是大多数人都试图从应用程序订阅插件中的事件。 我希望为第二个插件
订阅一个插件目前我的代码:
插件1事件:
public class Events
{
public event tester testingevt;
public delegate void tester(object o, EventArgs e);
public void fireIt()
{
if (testingevt != null)
{
testingevt(this, null);
}
}
}
插件2(订阅):
public void onLoad()
{
object tempInstance = pf.getInstance("thisisaplugin", "Events");
Type t = tempInstance.GetType();
t.GetEvent("testingevt").AddEventHandler(tempInstance, new EventHandler(tester));
}
我也看过各种MSDN文章,但没有一篇试图将一个插件订阅到另一个。
我使用的代码直接来自dreamincode.net链接。
我通过创建委托类型尝试了许多不同的方法,使用eventinfo变量来存储事件,这是我收集它的最接近的但是这段代码抛出的错误是:
'System.EventHandler'类型的对象无法转换为'Test_Plugin_for_Server.Events + tester'类型
请有人帮帮我吗?
提前致谢。
答案 0 :(得分:0)
你的问题有点模糊,似乎你想要那样的东西
public class Events {
// Usually, you don't have to declare delegate:
// there's a special class for it - EventHandler or EventHandler<T>
public event EventHandler TestingEvt; // <- let's make it readable
public void fireIt() {
if (TestingEvt != null) {
// Passing null is a bad practice, give EventArgs.Empty instead
TestingEvt(this, EventArgs.Empty);
}
}
...
}
...
private void tester(Object sender, EventArgs e) {
// Events that fired the event - if you need it
Events caller = sender as Events;
...
}
...
public void onLoad() {
// Get the instance
Events tempInstance = pf.getInstance("thisisaplugin", "Events") as Events;
// Or just create an isntance
// Events tempInstance = new Events();
...
// Assigning (adding) the event
tempInstance.TestingEvt += tester;
...
}