我用C++写了这个函数
extern "C" __declspec(dllexport)
bool addRecord(double id,char* name,double* x,double* y,   char* server,char* instance,char* database,
  char* user,char* pwd){
...
}现在想在C#中通过DLLImport声明来包装和调用,
[DllImport("****.dll")]
public static extern bool addRecord(Double id,String name,double* x,double* y,
String server,String instance,String database,
String user,String pwd);
系统提示“未将对象引用设置到对象的实例”
然后我通过如下方法进行声明
[DllImport("****.dll")]
public static extern bool addRecord(Double id,String name,IntPtr x,IntPtr y,
String server,String instance,String database,
String user,String pwd);也不成功。
请高人指点,如何才能正确调用。

解决方案 »

  1.   

    public static extern bool addRecord(double id,string name,double x,double y,string server,string instance,string database, string user,string pwd)
      

  2.   

    copico(学好.NET,天天进步)兄是什么意思,小弟不太明白,愿闻其详。
      

  3.   

    Have a try!
    using System.Text;public static extern bool addRecord( double id,StringBuilder name, [in] double x,[in] double y, StringBuilder server,StringBuilder instance,StringBuilder database,
    StringBuilder user,StringBuilder pwd);// Use "StringBuilder" type
    StringBuilder strTest = new StringBuilder( 256 );// Define a 256-length string
      

  4.   

    Knight94(愚翁) 兄,
    你给的代码怎么不能编译呀?
      

  5.   

    using System.Text;
    using System.Runtime.InteropServices ;public static extern bool addRecord( double id,StringBuilder name, [In] double x,[In] double y, StringBuilder server,StringBuilder instance,StringBuilder database,
    StringBuilder user,StringBuilder pwd);
      

  6.   

    麻烦Knight94(愚翁) 老兄再请问,
    在调用时如何将double[] xs,和double[]ys分别转换为[Int]double类型呢?谢谢了
      

  7.   

    你使用的是数组的话,可以如下:
    public static extern bool addRecord( double id,StringBuilder name, [In] double[] x,[In] double[] y, StringBuilder server,StringBuilder instance,StringBuilder database,
    StringBuilder user,StringBuilder pwd);orpublic static extern bool addRecord( double id,StringBuilder name, [MarshalAs( UnmanagedType.LPArray)] double x,[MarshalAs( UnmanagedType.LPArray)] double y, StringBuilder server,StringBuilder instance,StringBuilder database,
    StringBuilder user,StringBuilder pwd);
      

  8.   

    Sorry!
    public static extern bool addRecord( double id,StringBuilder name, [MarshalAs( UnmanagedType.LPArray)] double[] x,[MarshalAs( UnmanagedType.LPArray)] double[] y, StringBuilder server,StringBuilder instance,StringBuilder database,
    StringBuilder user,StringBuilder pwd);
      

  9.   

    两种方法都试了,还是不行也:(
    我再查查是不是动态库与封装代码不匹配。
    非常感谢Knight94(愚翁)老兄
      

  10.   


    http://www.aspxboy.com/private/showthread.asp?threadid=369c和c# 托管与非托管代码 中变量对应 http://www.aspxboy.com/private/showthread.asp?threadid=370
      

  11.   

    你的DLL函数很多都是char*,如果C#中不搞清楚这些指针的实际意义,是不好帮你写代码的。
    如果你用char*的目的是想改变原来的值,那在C#中可以用ref string,如果你用char*只是想传入一个字符串指针而不改变原值,直接用string 就行了,还有就是注意你所用的字符集要与DLL中的字符集匹配,不要一个用ANSI一个用Unicode,如果char*是一个输出参数,用out 修饰比较好。如果你的double* x表示的是一个数组的首地址,可以在函数定义中使用ref double,然后在C#中可以先定义数组double[] x = new double[10],传递的时候使用ref x[0]就是传递数组的首地址