temp = Marshal.AllocHGlobal(IntPtr.Size);
这个没申请成功?
检测下if (temp != IntPtr.Zero){
ask(question, out temp);}else{
//
//报错
//
}
这个没申请成功?
检测下if (temp != IntPtr.Zero){
ask(question, out temp);}else{
//
//报错
//
}
调试欢乐多
在C#中应该这么写[DllImport(@"XXX.dll")]
//如果这个函数第2个参数是一个out参数
public extern static int ask(string msg, out StringBuilder[] temp);
如果 在c#中这么写:
[DllImport(@"XXX.dll")]
//如果这个函数第2个参数是一个out参数
public extern static int ask(string msg, out StringBuilder[] temp);那该怎么调用呢?我按西面写,运行时就直接抛出异常了,一次调用也过不去
StringBuilder[] temp = new StringBuilder[200];
ask(Id, question, out temp);
HANDLE void* System.IntPtr 32 位
BYTE unsigned char System.Byte 8 位
SHORT short System.Int16 16 位
WORD unsigned short System.UInt16 16 位
INT int System.Int32 32 位
UINT unsigned int System.UInt32 32 位
LONG long System.Int32 32 位
BOOL long System.Int32 32 位
DWORD unsigned long System.UInt32 32 位
ULONG unsigned long System.UInt32 32 位
CHAR char System.Char 用 ANSI 修饰。
LPSTR char* System.String 或 System.StringBuilder 用 ANSI 修饰。
LPCSTR Const char* System.String 或 System.StringBuilder 用 ANSI 修饰。
LPWSTR wchar_t* System.String 或 System.StringBuilder 用 Unicode 修饰。
LPCWSTR Const wchar_t* System.String 或 System.StringBuilder 用 Unicode 修饰。
FLOAT Float System.Single 32 位
DOUBLE Double System.Double 64 位
这个表我也搜索到了,我最开始用IntPtr的写法就是参照这个表写的,但是只能调用一次,多次调用就会抛出异常
public extern static int ask(string msg, String[] temp);
这种方式我也试过,需要加上ref或out才有值,不加的话,temp就是空的,但是也只能调用1次,多次调用后就会随机抛出异常