在dll中创建事件并以表单处理事件
问题描述:
我使用以下代码创建了一个DLL。我已经将这些代码编译为一个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);