我想用C#做这样一个函数:
1)回调函数DLL给前台Form操作.
2)申请的调用回调函数在前台申明后使用时,由回调函数定义的一个事务(可以由一个线程DLL内部来触发)
3)前台使用这个函数由事务触发可以自动执行前台FORM的函数体.
例如:
前台要达到这样的效果
enum IEvent { aEvent,bEvent }
static void init(event,handle)//初始传入函数,和操作句柄
{
   DLL传入当前句柄和函数地址.如何写?
}static void event(ref IEvent aa,void* obj);//申请函数变量怎样实现
static void event(ref IEvent aa,void* obj)
{
   switch(IEvent i)
   {
      case aEvent:
         MessageBox.Show("a Event")
      case bEvent:
         MessageBox.Show("a Event")
   }
}DLL实现部分
static void thread()
{
   while (true){
      IEv = 满足某种条件,对应产生什么事务并赋值给IEv.
      (handle)handle.event((IEvent)线程条件事件传出,(handle)传入句柄);//把句柄回调主窗体的事处处理函数
   }
}
刚接触到NET所以请教高手写一个实例来实践.

解决方案 »

  1.   

    建议搂主看看.net里面"委托"的相关知识
      

  2.   

    把thread打包放在一个类里。需要修改DLL。
      

  3.   

    http://www.cnblogs.com/birdshover/archive/2008/01/07/1029471.html
    楼主看下这片文章,介绍的很全面。。希望对楼主有帮助
      

  4.   


    //#region DLL
    public delegate void MyCallBackEventHandler(IEvent event, Handle handle);class MyClass
    {
       public event MyCallBackEventHandler myEventHandler;
       private IEvent event;
       private Handle handle; 
      
       public void Init(IEvent event, Handle handle)
       {
          this.event = event;
          this.handle = handle;      
       }   public void MyThread() 
       { 
          while(true){ 
                this.event = ...; 
                //CallBack
                myEventHandler(this.event, this.handle);
          } 
       } 
    }
    //#endregionclass MyForm
    {
       public void MyCallBackEvent(IEvent event, Handle handle) 
       {
          ... 
       } 
       
       public void Run()
       {
           MyClass myClass = new MyClass();
           IEvent event = ...;
           Handle handle = ...;
           
           //参数传入DLL
           myClass.Init(event, handle);
           //委托
           myClass.myEventHandler += new MyCallBackEventHandler(this.MyCallBackEvent);              Thread td = new Thread(new ThreadStart(myClass.MyThread));
           td.Start();  
       }
    }
      

  5.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace CallBk
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public enum IEvent { IWrite,IRead}        public delegate void EventObj(ref object sender, ref IEvent op);    
            public EventObj evobj;
            public static packet pk;
            public static void Init(object fhandle, object handle)
            {
                pk = new packet(fhandle, handle);
            }        public void ShowEventMsg(ref object handle, ref IEvent ev)
            {
                if (handle == null) return;
                switch (ev)
                { 
                    case IEvent.IRead:
                        MessageBox.Show("IRead Event");
                        break;
                    case IEvent.IWrite:
                        MessageBox.Show("IWrite Event");
                        break;
                }
            }        private void button1_Click(object sender, EventArgs e)
            {
                evobj = ShowEventMsg;
                Init((object)evobj, this);
            }        private void button2_Click(object sender, EventArgs e)
            {
                if (pk == null) return;
                pk.stop();
            }
        }    public class packet
        {
            public enum IEvent { IWrite, IRead }
            public delegate void EventObj(ref object sender, ref IEvent op);
            private EventObj vo;
            private object hwnd;
            private IEvent ie;
            private bool work;
            public packet(object fhandle, object handle)
            {
                vo = (EventObj)fhandle;//无法将类型为“EventObj”的对象强制转换为类型“EventObj”。
                hwnd = handle;
                ThreadStart ts = new ThreadStart(thread);
                Thread t = new Thread(ts);
                t.Start();
                work = true;
            }        public void stop() {
                work = false;
            }        public void thread()
            {   
                bool i=true;
                while (work)
                {
                    if (i)
                    {
                        ie = IEvent.IWrite;
                        vo(ref hwnd, ref ie);
                    }
                    else
                    {
                        ie = IEvent.IRead;
                        vo(ref hwnd, ref ie);
                    }
                    i = !i;
                    Thread.Sleep(2000);
                }
            }
        }
    }
    我要实现这样一个功能.前台要简单化一个函数就OK,其它不用管后台来操作,后台处理结果前台一个函数根据信息来分别处理一下传出来的信息.现在调试出来上述一条错误
      

  6.   

    楼上的朋友们,非常感谢你们的参考信息.
    那句错误是没有NEW的原因,但还是很多错误.类型不能共用,如果我的PACKET封装起来的话那应怎样改?
    功能己实现了.
    public   enum   IEvent   {   IWrite,   IRead   } 
    public   delegate   void   EventObj(ref   object   sender,   ref   IEvent   op); 
    放出来就OK.