2011-02-28 51 views
0

我重写我的最后一个问题,只是因为我想从differente角度攻击问题..C# - 定义作用域事件处理程序

问题是这样的。我有一个用C#编写的类,有两个公共方法和一个事件处理程序,每当任何方法完成时触发。

我创建了这个类来调整表单中的代码。现在

,如果我引用这个类从写在VB.Net Windows进程的项目,我调用任何两种方法,该事件处理程序将不会触发

难道这个问题涉及到事件处理程序的范围或任何像那样?

如果有必要,我可以张贴代码

感谢

++++++++++++++++++++++++ UPDATE +++ +++++++++++++++++++++

好的..这里是代码。最初我是从一个类调用方法,但我修改了整个项目,看看问题是否与尝试从类中引发事件有关...因此,我有这个c#webserver在端口8080上监听, http请求根据URL参数调用ENROLL或IDENTIFY。

只是为了澄清一点。这是一个网络服务器,可以在连接有USB指纹扫描仪的计算机上运行。然后,Web应用程序将对该计算机执行http请求,以便执行身份验证或注册,这些操作在Web服务器中编程,操作包含在我用SDK获得的扫描仪驱动程序中的方法。

在驱动程序的SDK中附带了一个C#演示项目,这是一个简单的窗体,带有用于调用CLICK事件的ENROLL或IDENTIFY方法的按钮。 CLICK事件结束后(在其中执行ENROLL或IDENTIFY方法),然后触发事件并执行EventHandler。

因此,现在我已经在同一个项目中的所有代码,但它仍然以相同的方式执行......它进入ENROLL方法,该方法从WisSensorNLibLib类执行StartEnroll方法,但事件不会被触发,也不会触发由类自定义事件处理程序捕获...

也许我错在了定义或实例...我不知道。但该事件不会被触发...

所以这里是代码...(以及下面我将其粘贴在原演示程序代码,所以也许通过比较有人可以找出问题可能是什么)


namespace WinServer 
    { 
     using System; 
     using System.IO; 
     using System.Net; 
     using System.Net.Sockets; 
     using System.Text; 
     using System.Threading;  
     using System.Collections.Generic; 
     using System.ComponentModel; 
     using System.Data;   
     using System.Data.SqlClient; 
     using System.Drawing; 
     //************************************ 
     //This is the class that belongs to the Fingerprint Scanner 
     //************************************ 
     using WisSensorNLibLib; 


    class WinServer 
    {  
     private TcpListener myListener ; 
     private int port = 8080 ; // Select any free port you wish   
     private Int16 id; 
     private string indx; 
     //************************************ 
     //Create instance of WisSensorN  
     //************************************   
     WisSensorN WisObj = new WisSensorN();   
     private String mod;   
     private Int32 Rows; 

     public WinServer() 
     { 
      try 
      { 
       myListener = new TcpListener(IPAddress.Any, port) ; 
       myListener.Start();     
       Thread th = new Thread(new ThreadStart(StartListen)); 
       th.Start() ; 
      } 
      catch(Exception e) 
      { 
       Console.WriteLine("An Exception Occurred while Listening :" +e.ToString()); 
      } 
     } 

     public void SendHeader(string sHttpVersion, string sMIMEHeader, int iTotBytes, string sStatusCode, ref Socket mySocket) 
     { 
     //************************************ 
     //Code not related to understand specific problem was removed 
     //************************************   
     } 

     public void SendToBrowser(String sData, ref Socket mySocket) 
     { 
     //************************************ 
     //Code not related to understand specific problem was removed 
     //************************************ 
     } 



     public void SendToBrowser(Byte[] bSendData, ref Socket mySocket) 
     { 
     //************************************ 
     //Code not related to understand specific problem was removed 
     //************************************ 
     } 


     // Application Starts Here.. 
     public static void Main() 
     { 
      WinServer MWS = new WinServer(); 
     } 


     public void StartListen() 
     { 
     //Call ENROLL method 
     Enroll(); 
     mySocket.Close();      

     } 


     //********************************** 
     //EVENT CAPTURE 
     //********************************** 
     public void WisObj_DataEvent(WisSensorNLibLib.DATA data, string str) 
     { 

      switch (data) 
      { 
       //ENROLL 
       case DATA.DATA_ENROLL: 

        try 
        { 
         Console.WriteLine("success"); 
        } 
        catch (Exception ee) 
        { 
         Console.WriteLine(ee.Message);       
        }      
        break; 

       //IDENTIFY 
       case DATA.DATA_IDENTIFY_CAPTURE: 

        try 
        { 
         Console.WriteLine("Success"); 
        } 
        catch (Exception ee) 
        { 
         Console.WriteLine(ee.Message);      
        }      
        break; 
      } 
     } 

     //********************************** 
     //ENROLL 
     //After this method ends, WisObj_DataEvent should capture the event 
     //********************************** 

     public void Enroll() 
     { 
      try 
      { 
       WisObj.Open(); 
       WisObj.DataEvent += new _IWisSensorNEvents_DataEventEventHandler(WisObj_DataEvent); 
       WisObj.StartEnroll(); 
      } 
      catch 
      { 
       Console.WriteLine(ee.Message); 
      } 
     } 

     //********************************** 
     //IDENTIFY 
     //After this method ends, WisObj_DataEvent should capture the event 
     //********************************** 

     public void Identify() 
     { 
      try 
      { 
       WisObj.Open(); 
       WisObj.DataEvent += new _IWisSensorNEvents_DataEventEventHandler(WisObj_DataEvent); 
       WisObj.IdentifyCapture(); 
      } 
      catch 
      { 
       Console.WriteLine(ee.Message); 
      } 
     } 


     public void WisClose() 
     { 
      WisObj.Close(); 
     } 

    } 
} 

原始Demo程序代码:


using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Text; 
    using System.Windows.Forms; 
    using WisSensorNLibLib; 

namespace OR200N_Demo 
{ 
    public partial class Form1 : Form 
    { 
     private const int MaxUser = 10; 
     WisSensorN WisObj = new WisSensorN(); 
     string[] DB = new string[MaxUser]; 
     int nEnrolled = 0; 
     string indx; 
     string msg; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      MessageBox.Show("Please make sure the scanner is plugged!!"); 
      WisObj.Open(); 
      WisObj.DataEvent += new _IWisSensorNEvents_DataEventEventHandler(WisObj_DataEvent); 
      WisObj.SetDisplay((int)FingerPic.Handle); 
     } 

     private delegate void CompleteHandler(string bir); 
     private void Complete(string str) 
     { 
      Status.Text = str; 
     } 

     private void WisObj_DataEvent(WisSensorNLibLib.DATA data, string str) 
     { 
      switch (data) 
      { 
       case DATA.DATA_ENROLL: 
        indx = nEnrolled.ToString(); 
        msg = "User #" + indx + " is enrolled successfully!!"; 
        this.Invoke(new CompleteHandler(Complete), new object[] { msg }); 
        DB[nEnrolled] = string.Copy(str); 
        nEnrolled++; 
        break; 

       case DATA.DATA_IDENTIFY_CAPTURE: 
        int nMatched; 
        nMatched = WisObj.Identify(str, DB); 
        if (nMatched < 0) 
        { 
         msg = "No valid finger matched!!"; 
         this.Invoke(new CompleteHandler(Complete), new object[] { msg }); 
        } 
        else 
        { 
         indx = nMatched.ToString(); 
         msg = "User #" + indx + " is matched!!"; 
         this.Invoke(new CompleteHandler(Complete), new object[] { msg }); 
        } 
        break; 

       case DATA.DATA_VERIFY_CAPTURE: 
        break; 
      } 
     } 
     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      WisObj.Close(); 
     } 

     private void Enroll_Click(object sender, EventArgs e) 
     { 
      if (nEnrolled >= MaxUser) 
      { 
       MessageBox.Show("Exceed maximum enrolled number (10)!!"); 
      } 
      else 
      { 
       Status.Text = "Please put your finger on the scanner!!"; 
       WisObj.StartEnroll(); 
      } 
     } 

     private void Identify_Click(object sender, EventArgs e) 
     { 
      Status.Text = "Please put your finger on the scanner!!"; 
      WisObj.IdentifyCapture(); 
     } 
    } 
} 
+3

很难说没有看到代码。你能展示C#代码吗? – 2011-02-28 16:38:08

+0

发送一些代码,否则我们可以猜测... – 2011-02-28 16:38:46

+0

为什么有一个事件处理程序?你不能使用另一种方法,而是在两个公共方法的末尾调用它。 – 2011-02-28 16:41:02

回答

1

首先,它是事件,而不是引发的事件处理程序。
事件处理程序是一个方法,将归于给定事件。其次,范围仅在编译时管理成员可见性,不影响事件订阅。 如果事件可见,则可以使用。

从您发布的内容,可能只得出这样的结论:

  1. 您不可以预订事件在VB .NET代码或可能会错误地处理它;
  2. 当从VB.NET代码调用时,这些方法可能会有不同的行为(不同的参数被传递?引发抛出?),并可能不会引发事件。

到目前为止,这是我能说的,直到我看到代码。
你可以把它修剪成最简单的可重复的情况吗?

+0

感谢您的回复......添加更多下面... – jprealini 2011-02-28 20:13:26

+0

我试图详细说明我在做什么,但它被管理员删除了(太长),我无法用500个字符解释它...所以我不知道如何向你展示。 ..我可以给你的项目在一个RAR文件,所以你可以看看? – jprealini 2011-02-28 21:03:36

+1

@ jprealini - 您不能在评论框中发布太多代码 - 相反,您需要将其添加到原始问题中。点击问题底部的'edit'链接,就在标签列表下方,你应该可以添加你的代码(假设它少于30,000个字符) – Justin 2011-02-28 21:25:12