我的项目中有一个C++类需要供C#调用,我先把C++类封装成了一个COM组件,然后通过C#平台调用进行操作。大部份的函数都能正常操作,但是所有回调函数在我接到C++的回调并处理完成后会报内存错误。
C++类测试过没有问题,在C++项目中直接引用操作一切正常,封装时也没做太多动作,只是实例化一个全局对象,每个函数均执行对应的该对象中的公共方法。
这个问题难倒我好几天好,急盼大家帮忙出出主意。

解决方案 »

  1.   

    用out? 不太懂...我在C#中使用的是委托
    以下是相关的代码,请帮忙看一下:C++类中定义(COMM):
    SetStatusCallback(void (*s)(char id[], int status))
    COM 封装:
    void G_SetStatusCallback(void (*s)(char id[], int status)) { g_comm.SetStatusCallback(s); } //g_comm是定义的一个全局C++类对象
    C#中调用:
    public delegate void StatusCallBack(string id, int status);[DllImport("MyCom.dll", EntryPoint = "G_SetStatusCallback")]
    public extern static void APS_SetStatusCallback(StatusCallBack callback);public void statusCallBack(string id, int status)
    {
        MessageBox.Show(this, status.ToString());
    }现在出错的地方在statusCallBack方法执行完成后,出错点好像是C++类的那个文件,但是如果把它放在C++项目中直接调用却没有任何问题。
      

  2.   

    string id改成char id[] 或者stringbulder看看
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 最新版本:20070212http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  3.   

    改成char id[] 或者stringbulder 都出一样的错误,现在statusCallBack方法中可以正常取到id 和 status的值,只是方法执行完后过几秒钟后才报错。我想问题是不是出在封装那里?
      

  4.   

    你的C#程序是怎么用delegate的?APS_SetStatusCallback(new StatusCallBack(this.statusCallBack));这样的问题是new出来的delegate没有.NET的reference,所以CLR会认为他没有用被GC回收了。
    把delegate做成一个类的成员变量。class WhatEver {
       ...
       private StatusCallBack mCallBack = new StatusCallBack(this.statusCallBack);
    }
      

  5.   

    我的委托就是用的 APS_SetStatusCallback(new StatusCallBack(this.statusCallBack));
    但是我把delegate先定义好,问题还是同样存在
      

  6.   

    贴一下你修改后的代码,
    应该是委托定义的问题,要先new出来,作为类的成员变量,这样就不会被回收了
      

  7.   

    public partial class Form1 : Form
        {
            private StatusCallBack dgStatus;   //delegate define        public Form1()
            {
                dgStatus = new StatusCallBack(this.statusCallBack);   //delegate define            InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Server.APS_SetStatusCallback(dgStatus);  //
            }        public void statusCallBack(StringBuilder id, int status)
            {
                APSAPI.APS_SendStatusOK(id.ToString(), status);
                MessageBox.Show(this, status.ToString());
            }
        }
      

  8.   

    还没有解决啊, 最新情况是我把封装后的dll放到C++的项目中能正常使用,那么就说明问题出在C#项目中的引用或委托这个方面,请大家帮忙出出主意!
      

  9.   

    自己ding!!!!, 千万不要沉下去了!
      

  10.   

    问题已经解决了,谢谢大家, C#平台调用C++回调函数一定要加 __stdcall约定,