我已经使用以下代码创建了一个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;
}
}
}
我的问题,我不确定我哪里出错了。请提出建议。
您需要分配事件处理程序之前实际上已触发事件,否则代码将抛出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);
}
如@Gene所说,您需要在引发事件之前注册事件。无论如何,通过检查null来检查是否有人注册了您将要引发的事件是一种好习惯。
像这样:
if (this.CallAlert != null)
this.CallAlert(new object(), alertEventArgs);