请问怎样在c#下调用VC++的动态链接库,并且要调用的方法有指针类型的参数。
具体描述如下:
VC++的动态链接库中包含这样的方法方法一:void GetOSNR(double* pOSNR);
方法二:void GetAllData(unsigned char* pBuf);请问在C#中怎样才能调用这两个方法。

解决方案 »

  1.   

    http://blog.csdn.net/turejackon/archive/2009/01/17/3815149.aspx
      

  2.   

    用PInvoke不就可以了
    [DllImport(“msvcrt.dll”)]
    extern static int GetOSNR(ref double pOSNR);
    希望能对你有帮助:)
      

  3.   

    但是如果参数需要的数组怎么办呢?也就是说参数“pOSNR”是double型的数组。
    是引用数组的第一个元素吗,如下:
    double[] pOSNR = new double[count];
    int i = GetOSNR(ref pOSNR[0]);
      

  4.   

    数组的话这样:
    [DllImport(“msvcrt.dll”)]
    extern static int GetOSNR([MarshalAs(UnmanagedType.LPArray]ref double pOSNR);
    double[] pOSNR = new double[count]; 
    int i = GetOSNR(ref pOSNR[0]); 
      

  5.   

    更正一下:
    [DllImport(“msvcrt.dll”)]
    extern static int GetOSNR([MarshalAs(UnmanagedType.LPArray]ref double[] pOSNR);
    double[] pOSNR = new double[count]; 
    int i = GetOSNR(ref pOSNR[0]); 
      

  6.   

    如果是非托管的,就用DllImport,举例 
      using System; 
      using System.Runtime.InteropServices; 
      class MainApp 
          [DllImport("Kernel32")]                    //读取动态库文件 
            public static extern int GetProcAddress(int handle, String funcname);   给你讲一下我的经验: 
      首先 你在C#中调用的 是C++ 写的一个动态库。比如Kernel32.dll 中的 函数; 
      这个函数用C++写 有如下要求: 
    1、 必须为全局函数 
    2、 函数参数 必须为基本类型,也就是C++ 和C#都有的类型,否则你在public static extern int GetProcAddress(int handle, String funcname); 
        这里没有办法声明。 其余的 没什么了; 还有你可以参考这里:http://blog.csdn.net/jingshuaizh/archive/2009/02/04/3862019.aspx先前用VC写的程序生成的DLL,C#里能够调用么? 
    可以的话,在VC里传入参数为CString,而C#里是string,怎么传参数呢? 再者就是问,用VC写的DLL如果是一个导出类,而不是函数接口,C#里可以直接调用么? 
    第一个问题我遇到过, 可用如下方法解决:   VC++ 中为: int Set(char** str,int n);          //将 String 改成 char** , C# 中没有与String对应的类型 
      C#  中为: int Set(ref string str,int n); 
      
      VC++ 中的 BOOL 类型对应 C# 中的 System.Int32 类型, 建议改动一下参数类型吧.第二个问题,生成的DLL里的函数在一个类里面,这样的话在C#里需要实例化那个类么?怎么做 
    比如说,类solution里有函数int getch(int a); 
    我怎么调用这个getch函数?? 建议在C++中另外写个函数封装一下, 如: 
      int Dllgetch(int a) 

        solution st = //实例化 类solution 
        return st.getch(a); 

    这个 Dllgetch(int a) 就可以提取出来供 C# 调用.
    你的方法可以,我也解决了 
    将CString 改成了LPCTSTR 
    BOOL在C#中对应的是Boolean
      

  7.   

    还是错了,正确的:
    [DllImport(“msvcrt.dll”)]
    extern static int GetOSNR([MarshalAs(UnmanagedType.LPArray]ref double[] pOSNR);
    double[] pOSNR = new double[count]; 
    int i = GetOSNR(ref pOSNR); 
    你可以在msdn中看下MarshalAs的具体用法PS. 一大早状态不太好,不好意思啊
      

  8.   

    出现了一个新的问题。
    程序运行到代码 
    int i = GetOSNR(ref pOSNR); 时会自动退出。也不抛出异常。
      

  9.   

    重新看了下方法签名好像不对啊
    extern static void GetOSNR([MarshalAs(UnmanagedType.LPArray]ref double[] pOSNR);原型不是void GetOSNR(double* pOSNR); 异常的问题是比较奇怪的,你再试试:)
      

  10.   

    上面是我写错了,不过还是存在同样的问题。
    执行到调用外部代码的那行时,程序就自动结束了,
    因为dll是别人写的,也没有源代码,所以是在弄不清楚为什么程序会自动退出。我现在把方法签名改成这样
    extern static void GetOSNR(double[] pOSNR);调用的时候直接传递一个数组运行一次没什么问题。
    但是如果我在一个另线程中循环调用时,一会儿线程就终止了,程序就没响应了。
      

  11.   

    有时候还抛出这样的异常:检测到 FatalExecutionEngineError
    Message: 运行库遇到了错误。此错误的地址为 0x79f6b4a3,在线程 0xd80 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。