我使用以下代码创建了一个DLL。我已将此代码编译为DLL。
namespace DllEventTrigger
{
public class Trigger
{
public delegate void AlertEventHandler(Object sender, AlertEventArgs e);
public Trigger()
{
}
public void isRinging()
{
AlertEventArgs alertEventArgs = new AlertEventArgs();
alertEventArgs.uuiData = "Hello Damn World!!!";
CallAlert(new object(), alertEventArgs);
}
public event AlertEventHandler CallAlert;
}
public class AlertEventArgs : EventArgs
{
#region AlertEventArgs Properties
private string _uui = null;
#endregion
#region Get/Set Properties
public string uuiData
{
get { return _uui; }
set { _uui = value; }
}
#endregion
}
}
现在我正在尝试使用此代码在表单应用程序中处理此dll触发的事件。
namespace DLLTriggerReciever
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Trigger trigger = new Trigger();
trigger.isRinging();
trigger.CallAlert += new Trigger.AlertEventHandler(trigger_CallAlert);
}
void trigger_CallAlert(object sender, AlertEventArgs e)
{
label1.Text = e.uuiData;
}
}
}
我的问题我不知道我哪里出错了。请建议。
答案 0 :(得分:5)
您需要在实际触发事件之前指定事件处理程序,否则代码将抛出NullReferenceException
。
trigger.CallAlert += new Trigger.AlertEventHandler(trigger_CallAlert);
trigger.isRinging();
此外,建议首先检查是否分配了处理程序:
var handler = CallAlert; // local variable prevents a race condition to occur
if (handler != null)
{
handler(this, alertEventArgs);
}
答案 1 :(得分:2)
正如@Gene所说,你需要在提升之前注册该事件。 无论如何,通过检查空值来检查某人是否注册了您即将筹集的事件是一种很好的做法。
像这样:if (this.CallAlert != null)
this.CallAlert(new object(), alertEventArgs);