2012-07-18 56 views
3

我使用以下代码创建了一个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; 
     } 
    } 
} 

我的问题我不知道我错了哪里。请建议。

回答

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); 
} 
2

为@Gene说,你需要提高其之前注册事件。 无论如何,最好通过检查null来检查某人是否注册了您即将举办的活动。

这样的:

if (this.CallAlert != null) 
    this.CallAlert(new object(), alertEventArgs);