我用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);也不成功。
请高人指点,如何才能正确调用。
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);也不成功。
请高人指点,如何才能正确调用。
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
你给的代码怎么不能编译呀?
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);
在调用时如何将double[] xs,和double[]ys分别转换为[Int]double类型呢?谢谢了
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);
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);
我再查查是不是动态库与封装代码不匹配。
非常感谢Knight94(愚翁)老兄
http://www.aspxboy.com/private/showthread.asp?threadid=369c和c# 托管与非托管代码 中变量对应 http://www.aspxboy.com/private/showthread.asp?threadid=370
如果你用char*的目的是想改变原来的值,那在C#中可以用ref string,如果你用char*只是想传入一个字符串指针而不改变原值,直接用string 就行了,还有就是注意你所用的字符集要与DLL中的字符集匹配,不要一个用ANSI一个用Unicode,如果char*是一个输出参数,用out 修饰比较好。如果你的double* x表示的是一个数组的首地址,可以在函数定义中使用ref double,然后在C#中可以先定义数组double[] x = new double[10],传递的时候使用ref x[0]就是传递数组的首地址