c++代码:
class qf
{
private:
char *id;
char *mc;
float sd;
int LX;
};
函数:int EntryPoint(qf *qfw);
c#代码:
public class qf
{
private string id;
private string mc;
private float sd;
private int LX;
};
c#调用:
qf[] qfw = new qf[2];
for (int i = 0; i < qfw.Length; i++)
{
qfw[i] = new qf(t, t, (float)0.5, 1);
}
IntPtr[] ptrarr = new IntPtr[1];
ptrarr[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(qf)) * 2); //分配包含两个元素的数组
IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(qf)));
Marshal.Copy(ptrarr, 0, pt, 1); //拷贝指针数组
dll.EntryPoint( pt);
可以进入c++,但是传进去的pt是乱码?这是为何呢?求大神解释?
c++中是class,但是其实存储的都是数据,并没有任何成员操作函数,所以在C#中,你可以处理为struct,后面依然是通过marshal中相关structure操作函数
进行操作~ 函数名称具体忘记了,可以查阅下marshal类~
ps:最好能在开发中调试下pt的地址是否有效
为什么我传进去的LX是ptraar【0】的值
c++中用char 数组,而不是指针
指针应该列集为IntPtr。
调用的时候需要用Marshal.AllocHGlobal或者Marshal.AllocCoTaskMem之类的函数申请一块固定的内存,把内存地址保存到IntPtr再列集。
当然,谁分配谁释放,就算中间出异常了也不要搞内存泄漏就是。
如果C++代码改了指针目标内存的数据,想把IntPtr指针指向的内存复制成字符串的话,
可以用Marshal.PtrToStringAnsi或者Marshal.PtrToStringUni把字符数据复制到托管堆。