由于公司要重新编写产品界面,要求用.net来编写,但是底层用以前C++编写的代码,小弟从来没有接触过C#的东西,在过程中遇到了C++与C#相互访问的问题,现在有一个问题希望知道的朋友不吝赐教:1.我现在有一个C++编写的Dll(TESTCSharp.dll),里面有一个extern "C" __declspec(dllexport)  int mySum((*void)TestFun(CString str))函数,mySum这个函数我在C#用静态加载Dll的方式已经调用出来,而参数TestFun这个函数是C#中的一个委托,委托调用的是C#的一个功能函数;2.我在C#(namespace WindowsApplication)中调用c++里面用[DllImport]的方法,调用mySum这个函数,并把委托TestFun作为参数传递到C++里,从而实现C++回调C#函数的目的.但是现在遇到的问题是,我不知道如何在C++中包含这个委托,让编译器识别到它不报错出来.
附:不知道各位朋友在用C++调用C#定义的回调函数时通常是怎么做的,我这个方法是否能行?请熟手指点迷津,小弟是初学者,又单位有时间要求,所以希望能有例子讲解,email:[email protected],小弟不胜感激.

解决方案 »

  1.   

    先把CString改掉吧。
    在C++里,就是调用那个函数指针,没有什么委托。
      

  2.   


    那我在调用的时候用char*,另外我想请教一下soaringbird, 我该如何在C++该如何写代码才能让C++工程识别到C#定义的类型或者方法.
      

  3.   

    参见:http://topic.csdn.net/u/20090809/15/bc5644c0-7a28-4dec-98dd-9ec7d65db0bc.html
      

  4.   


    soaringbird,你好:
    这篇帖子描述的是如何设置C++ Dll外调函数参数的问题,我现在是C++的文件在编译的时候报错,因为C++不能识别到C#代码中定义的委托,C++调用C++的代码是需要#include "某个头文件",然后就可以使用头文件中定义的变量或者方法, 如果要让C++识别到C#中定义的方法,是不是需要用using namespace ""引用我C#的命名空间,""中是不是应该怎么些,添加了命名空间是不是就可以使用C#定义的东西了.
    备注:我的C#没有生成dll,只有一个winform的exe程序
    小弟才接触C#几天,麻烦soaringbird大哥说明下,谢谢了.在线等
      

  5.   

    你的C++里不是有这么一个函数吗?int mySum((*void)TestFun(CString str)),这个函数并不需要知道那个TestFun是哪来的,是C++程序给的还是C#程序给的,它只知道是个函数指针,TestFun(...)这么调用就可以了
      

  6.   


    谢谢soaringbird大哥,如果TestFun不带参数能够O了,先上分了,另有一个问题请教,一旦加入参数就报错,我的参数仅仅就是一个字符串,请大哥看看.
    C#代码如下:
    定义委托
    delegate void TestFun(string strTst);然后
    TestFun _test = new TestFun(CallBackFun);
    IntPtr pCallBack = Marshal.GetFunctionPointerForDelegate(_test);
    mySum(pCallBack);
    public static void CallBackFun(string input)
    {
      MessageBox.Show(input);
    }C++代码
    extern "C" __declspec(dllexport)  int mySum(void(*TestFun)char* pstr)) //这个地方在编译的时候报错  'pstr' : undeclared identifier
    {
    TestFun(pstr);
    return 0;
    }
      

  7.   


    是我在发帖的时候编辑错了,代码是
    extern "C" __declspec(dllexport)  int mySum(void(* TestFun)(char* pstr)),是按照网上的一个例子写的.
      

  8.   

    mySum里面,你需要有一个pstr变量或者有一个pstr参数,传递给TestFun。
    int mySum(void(* TestFun)(char* pstr),char*pstr)。这两个pstr不是一回事的。
      

  9.   

    请问soaringbird 大哥C#代码如下: 
    定义委托 
    delegate void TestFun(string strTst); 然后 
    class Main
    {
    //...其他代码略过
    [DllImport("TESTCSharp.dll")]
    public static extern int mySum(IntPtr pKines);
    TestFun _test = new TestFun(CallBackFun); 
    IntPtr pCallBack = Marshal.GetFunctionPointerForDelegate(_test); 
    mySum(pCallBack); //返回过来的时候出错
    }public static void CallBackFun(string input) 

      MessageBox.Show(input); //这个函数被调用了2次
    } C++代码 
    extern "C" __declspec(dllexport)  int mySum(void(*TestFun)(char* pstr)){ 
    TestFun("传入了自定义的字符串"); 
    return 0; 
    }请问下,是不是调用了回调函数需要马上释放内存里面的东西,该如何释放?