感觉是回调函数调用有问题,
但是也很奇怪,为什么用开发工具编译运行没有问题,
但是直接运行EXE程序就报错误。项目-->属性-->生成-->勾选"允许不安全代码"
也同样有这个"代理函数被回收"的错误。
=======================
项目-->属性-->调试-->勾选"启用非托管代码调试"
调试时的提示信息如下:托管调试助手“CallbackOnCollectedDelegate”
在“桌面\testDLL\bin\Debug\testDLL.exe”中检测到故障。
其他信息: 对“testDLL!testDLL.Form1+LPONGETMSG2::Invoke”
类型的已垃圾回收委托进行了回调。
这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,
托管应用程序必须让这些委托保持活动状态,
直到确信不会再次调用它们。
=======================
项目-->属性-->生成-->配置下拉框选择"Release",有是同样的错误。

解决方案 »

  1.   

    深入理解C#委托的实质
    http://developer.51cto.com/art/200909/150396.htmC#中调用 调试C++的DLL 
    http://blog.csdn.net/jaylongli/archive/2010/06/01/5638598.aspxC#动态调用C++编写的DLL函数
    http://www.zxbc.cn/html/20080508/34128.html
      

  2.   

    =================
    调用C++编写的DLL程序,用到了一个回调函数.
      

  3.   

    //用下面的代码实现,
    //通过回调方式接收C++制作的DLL,传回的数据
    //在VS2005环境下,直接编译运行没有报错
    //但是但是直接运行EXE程序出现系统异常
       public partial class Form1 : Form
        {
    //C++函数原型
    //typedef int(CALLBACK  *PFCALLBACK2)(unsigned char *&ucData, int *dataLen);    //定义代理函数    
    public delegate int LPONGETMSG2(ref IntPtr data, ref int retVal);
            
           [DllImport(@"MFCDLL.dll", EntryPoint = "RegisterCallBackFunc2", CharSet = CharSet.Ansi)]
            public static extern void RegisterCallBackFunc2(LPONGETMSG2 CallbackFuncs2);       //回调方式接收DLL传回的数据
           //把data中的数据拷贝到newm数组中
           private int funcTest2(ref IntPtr data, ref int retVal)    
           {
            byte[] newm = new byte[retVal];
            Marshal.Copy(data, newm, 0, retVal);      
            //执行绘图操作        return 0;
           }        //注册代理函数
            private void button1_Click(object sender, EventArgs e)
            {
               //C++函数原型  
               //extern "C" __declspec(dllexport) void RegisterCallBackFunc2(PFCALLBACK2 Func2); 
            
               RegisterCallBackFunc2(funcTest2);   
            }
        }
      

  4.   

    程序出现异常的原因是,代理函数还在使用,已经被回收;
    被回收的原因,可能是下面两行代码有异常,
    但是在编译运行的时候没有错误。private int funcTest2(ref IntPtr data, ref int retVal)    
    {
    byte[] newm = new byte[retVal];
    Marshal.Copy(data, newm, 0, retVal); //======================
    在网上看资料介绍,使用GCHandle.Alloc为这个委托建立一个句柄,
    或者定义static类型的委托,具体不太清楚如何修改。
      

  5.   


    哎,我太死板了,居然连使用static的方法都没想到,惭愧啊!!
    谢谢这位兄弟提醒