继续。。。。
网上有很多的定义结构体的方法:
第一种:
public struct strutest
{
public int csp;
public unsafe fixed int plan[4];
}
这种方法直接把数组定义成了fixed的形式,这样做的结构就是该数组成为了一个指针的形式,这样做可以方便的像里面传递值,但是问题出在了调用之前写的xamConverter类的时候有一个
Marshal.StructureToPtr(strutest, ptr, true);
这样的话数值 csp 是转过去了,但是plan[4]的地址发生了变化,它的值全部没了。。。。郁闷
第二种:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct struTest
{ public int[] data;
public int[] fft;
};
这种方法其实是在
调试的时候可以用的,但是会报错 AccessViolationException 尝试catch它不让报错中断运行
但是。。。。微软说,不行啊不行 详见:http://connect.microsoft.com/VisualStudio/feedback/details/557105/unable-to-catch-accessviolationexception
我连 调试--》异常》报警错误都改了还是不行
第三种:
public struct struTest
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
public int[] data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst =1024)]
public int[] fft;
};
这个是我使用的定义结构体的方法
在xamConverter类中的第一种方法即调用fixed的方法中是不能用的,因为:不能调用指向托管类型的指针;
第二种方法可以用了 UnmanagedType.ByValArray, SizeConst = 1024分别定义了类型和长度
资源下载链接;http://download.youkuaiyun.com/detail/zlei2013141/4278982
对于要和c++结构体进行交互的 提供一种最简单的方法
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct struTest
{ public int[] data;
public int[] fft;
};
去掉红色部分 ,就能使对齐方式和c++默认的相同
如果c++ 使用#program pack=n 改变了对齐方式,把红色部分改成Pack=n就行了。