在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所说,你需要在提升之前注册该事件。 无论如何,通过检查空值来检查某人是否注册了您即将筹集的事件是一种很好的做法。
像这样:
if (this.CallAlert != null) this.CallAlert(new object(), alertEventArgs);
- 如何在C#中获取IP地址?
- CancellationTokenSource与Task循环退出的退出标志之间的区别
- ‘无法加载文件或程序集’netstandard,Version = 2.0.0.0,…’。 不应加载引用程序集以执行
- 没有配置身份validation处理程序来validation该方案:Microsoft.AspNet.Identity.External
- 不要在选择某些项目时关闭ContextMenuStrip
- 是否可以在C#中使用分支预测提示?
- 在Newtonsoft.json中,ReferenceLoopHandling.Ignore究竟做了什么?
- Activator.CreateInstance找不到构造函数(MissingMethodException)
- 多态性:ORM实体是域实体还是数据实体?