各位好,我用C#写了个程序,要调用一个C++编写的DLL(也是我写的),我现在想让这个DLL返回个字符串的数组,请问应该怎么写啊?
在C++那端定义成 string* Getstr(); 可以吗?那在C#这边要怎么写呢?
我写了 [DllImport("D:\\Ata.dll", EntryPoint = "Getstr",CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]
public unsafe static extern string[] Getstr(); 但结果报
无法封送处理“return value”: 无效的托管/非托管类型组合用public unsafe static extern string* Getstr(); 说
无法获取托管类型(“string”)的地址和大小,或无法声明指向它的指针请问应该怎么解决啊?谢谢了!
在C++那端定义成 string* Getstr(); 可以吗?那在C#这边要怎么写呢?
我写了 [DllImport("D:\\Ata.dll", EntryPoint = "Getstr",CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]
public unsafe static extern string[] Getstr(); 但结果报
无法封送处理“return value”: 无效的托管/非托管类型组合用public unsafe static extern string* Getstr(); 说
无法获取托管类型(“string”)的地址和大小,或无法声明指向它的指针请问应该怎么解决啊?谢谢了!
报语法错误。
public static extern StringBuilder Getstr(); 返回的好象是个数组,但StringBuilder pt;
pt = RefComm.Getstr();
MessageBox.Show(pt[0].ToString());打出的是乱码,我以前没有用过StringBuilder ,不好意思。。
然后用
Marshal.Copy(IntPtr source,
char[] destination,
int startIndex,
int length
) 复制出去.
最好一行写完Marshal.Copy( Getstr() , ..... );这样写
10楼的,用Marshal.Copy的话,必须事先知道返回的数组的大小,是吧?
Marshal.Copy(RefComm.Getstr(bytes), bytes, 0, 300);
但好象如果string[]中或一string的长度超过16,它在内存中的位置会有变化。
char* getstr()
{
char sz[32]="asduifhsdfafd";
return sz;
}
要是类似这样的写法,C#用何种方式都不可能调用成功的。要成功只能说是运气
建议楼主返回字符串,用特殊字符进行分割,C++中返回char*,封送成C#的时候直接返回string,然后进行分割得了
void GetStr(VARIANT* var);
其中var中放一个BSTR类型的1维数组。
这个在赶进度,就先取了个折中的办法,在C++里把字符串数组的值写到文本文件里,再让C#去读,先将就了。
1 10 20 25
2 20 20 25
3 30 20 25
4 20 25 30的二维表,其实列数、列名、行数都不确定。