DLL接口如下:int testfunction(char* A,char* B,char* C,char** D),其中,D是个返回参数。求教一下在C#中用DLLImport调用这个DLL,应该怎样做才能给这几个参数赋值并且获取到testfunction和参数D的返回值?还需要做垃圾回收吗?谢谢先!

解决方案 »

  1.   

    int testfunction(char* A,char* B,char* C,char** D);这样试一下
    int testfunction(StringBuilder A,StringBuilder B,StringBuilder C,ref string d);
      

  2.   

    c#里的函数声明中 char** D 写成 out IntPtr D
    调用的地方实参类型为IntPtr,调用处加上out修饰
    执行完后用Marshal.PtrToStringAnsi将数据转换为string
      

  3.   

    sunchaohuang兄:能详细说说么?我对指针算是个门外汉,实在是搞不清C#的调用代码应该怎么写?
      

  4.   

    int testfunction(string A,string B,string C,string D)//char** D  你要看这个是否有输出值,否则不用out了吧,试试看么
      

  5.   

    char**D是C++函数分配的内存的话,会有内存漏洞
      

  6.   

    soaringbird兄,能详细说说么?我对指针实在没有什么概念,你说的解决办法理解是理解了,但还是不知道代码应该怎么写?
      

  7.   

    我们项目组里原来的应用程序是用C++写的,引用的DLL是其它公司的一个C++的DLL,现在公司想换成C#来做应用层,可是原来从来没在C#里用过指针,所以这方面很模糊,用C#写的话内存漏洞是否可以避免?
      

  8.   

    int testfunction(char* A,char* B,char* C,char** D)
    A、B、C看来仅仅是传入的,就写作string就可以了,D要传出,并且是**的,看来内存是在这个函数内部分配的。
    所以可以写成
    int testfunction(string A,string B,string C,out IntPtr D);但是D的内存现在没法释放,我还不知道在c#中如何释放这样的内存
      

  9.   

    回goga21cn兄:D肯定是有返回值的,用于返回错误详细信息的
      

  10.   

    内存分配的问题我问了一下同事,他们的做法是他们申请内存地址,然后把该地址传给D,D在该地址中写入数据什么的,D应该没有主动去申请内存地址
      

  11.   

    前段一直弄C#调C++,这个表希望能帮lz,自己胡乱总结的C++            C#
    =====================================
    WORD            ushort
    DWORD            uint
    UCHAR            int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
    UCHAR*            string/IntPtr
    unsigned char*         Intptr
    char*            string
    LPCTSTR            string
    LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
    long            int
    ulong               uint
    Handle            IntPtr
    HWND            IntPtr
    void*            IntPtr
    int            int
    int*            ref int
    *int            IntPtr
    unsigned int        uint
    COLORREF                uint
      

  12.   

    那就int testfunction(string A,string B,string C,out string D)//前面带上out
      

  13.   

    只要你确定D是个输出参数,也就是 在调用这个函数的地方使用的话,加上out
      

  14.   

    int testfunction(string A,string B,string C,ref string D); 
      

  15.   

    不是也成,而是必须得是ref,但这种调用方分配内存的char**必须得是ref,倒是string 和StringBuilder用哪个也可以,但StringBuilder写起来麻烦点。如果是被调用方分配内存,就得用out IntPtr了,string和StringBuilder都不行。
    但他这个函数也有点那个,既然是调用方分配内存,char*就可以了,非写个**,多此一举。
      

  16.   

    是啊,弄不明白为什么要这么写,而且dll里引用指针作为参数我觉得并不人性化,毕竟这个组件面对的客户不一定都会C++及指针的调用,为什么不能做个通用化的参数调用来方便用户的二次开发呢?
      

  17.   

    明天我再试试,没有问题我就加分结贴了!谢谢各位先!对了,我还想了解一下,C#里使用指针属于非安全代码,那么,.net的垃圾回收机制会对非安全代码产生的内存使用情况自动进行回收么?
      

  18.   

            public static void Free(object obj)
            {
                if (obj != null) Marshal.ReleaseComObject(obj);
                obj = null;
            }
      

  19.   

    Sphonix兄,你的这段代码是在做清理工作吧?
      

  20.   

    int testfunction(string A,string B,string C,ref string D); 
    如果A B C中有的参数在函数中会改变的话,使用StringBuilder。关于D参数,20楼讲的很清楚了,我这里补充一句就是这些都是函数声明的地方的写法,调用的时候注意如果使用了ref或者out关键字,调用的时候就要带上这个关键字一起。
      

  21.   

    请问下DLL中int GetEvent(Event **buf)怎样转换为c#的,其中Event为dll中自定义的类,buf获取返回结果。