c++里面是这样写的:
typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
    LPVOID lpThreadParameter
    );
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
#ifdef WIN32
DMS_API int NetSetCallBack(LPTHREAD_START_ROUTINE (*callback)(MsgData *));
#else   // WIN32
DMS_API int NetSetCallBack(void *(*callback)(MsgData *));
#endif  // WIN32
那我在C#里怎么调用?请高手们帮忙!!!

解决方案 »

  1.   

    这个有回调函数了,原型有指向函数的指针 
    C#要用委托传进去
    给你个例子1. C#调用C++的方法,将委托传入
    2. C#调用C++的方法,C++在方法里调用函数指针,函数指针调用C#委托,C#委托操作数据返回给C++,C++再将数据返回给C#的调用的位置.(整个流程在这个示例程序的意义基本没有,只是为了演示可以实现的几种交互方式而已,在具体使用时可以选择其中的任意一种.)
    3. C++中声明函数指针类型
    typedef char* (__stdcall *PFCALLBACK)(char* a,int Param1,int Param2,char* revData) ;
    注释:返回值是char*,有四个参数,为了具体演示,参数多了一些,后面可以具体用到.
    4. C#中委托声明
    public delegate string TDeletage(string a, int Param1, int Param2, StringBuilder revData);
    注释:C++中的返回值char*对应C#中的返回值string,
        C++中的int类型参数对应C#里的int参数没问题
        C++中的char* a对应C#中的string a,这里不做解释.下面会解释
        C++中的char* revData对应C#的StringBuilder revData.这里解释一下,为何第一个参数对应的类型是string,而这里的参数却传递了StringBuilder,因为第一个参数是值传递,而这个数做的演示程程序在C#的代码里修改了revData的值,再传递回C++里,所以用到了StringBuilder.
    5. C++中创建函数指针变量
    PFCALLBACK mcallback2;
    6. C++中声明函数导出方法
    extern "C" void __stdcall MInit(char* (__stdcall *bak)(char* a,int Param1,int Param2,char* revData))
    {
    mcallback2 = bak;
    }
    注:方法中所描述的类型必须与函数指定的类型相同.这个方法里将传入的给函数指针赋值.
    7. C++中声明调用函数指针的方法
    extern "C" char* __stdcall MCall()
    {
    char* a = "adfasdf";//初始化a的值,传递给C#的委托
    char c[100];//初始化C的长度,给C#操作后返回的值,但是C#操作时不能超越它的长度
    char* rev = mcallback2(a,1,2,c);
    return c;
    }
    8. C#声明C++ 的导出函数
    [DllImport("DLL名称")]
    public static extern void MInit(TDeletage a);
    9. C#声明委托
    TDeletage delete;
    注:C#此处声明的委托必须是静态的,或者全局的,保证垃圾回收站不会回收掉该委托.经过试验,该委托当作函数指针传递到C++后,虽然C++用着.但垃圾回收还是会回收掉.然后下次C++调用时就会报错
    10. C#创建委托的方法
    public string Rev(string d, int a, int b,StringBuilder revData)
    {
            revData.Remove(0, revData.Length);
            revData.Append("eee");//注意,这里append的长度不能超过在C++里定义的长度,否则会出错
                return "aafsdsadf";
      }
    11. C#创建委托
    delete = new TDeletage(Rev);
    12. C#调用C++中调用函数指针的方法
    string a = MCall();
      

  2.   

    c++封装成dll 然后c#调用dll文件
      

  3.   


    +1
    在c#类中先声明c++dll中的方法。
    然后在需要的方法中调用即可