关于C#如何使用Prodave(实战DllImport)
2009-06-16 08:33:22 来源:WEB开发网好吧,起先其他的转换网上都有,不难,但是出现了union共用体,恩C#没有这个概念。怎么办?起先,参考网上的资料,采用
[StructLayout(LayoutKind.Explicit)]
struct S1
{
[FieldOffset(0)]
int a;
[FieldOffset(0)]
int b;
}
类似这样的布局,再加上类似[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]的声明。
但是,最终单纯的使用2个数组作为“共用体”字段的话是可以通过编译的,但是再加上unsigned char Mpi的话,OK你是过不了编译的,就算过了运行也出错。反复尝试还是失败,最后我联想到在内存中实际上这个共用体用的是一个以最大字段为空间大小的内存,于是乎尝试了,直接定义[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]byteMac[6],果然解决了,共用体的问题,其实C++传进去的参数也其实是6字节的数组而已,进而想既然一个数组搞定,那么还用共用体干嘛,不要了,于是出现了如下函数转换的正解:
public struct CON_TABLE_TYPE//待连接plc地址属性表
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
//public CON_ADR_TYPE Adr; // connection address
public byte[] Adr; // connection address
// MPI/PB station address (2)
// IP address (192.168.0.1)
// MAC address (08-00-06-01-AA-BB)
public byte AdrType; // Type of address: MPI/PB (1), IP (2), MAC (3)
public byte SlotNr; // Slot number
public byte RackNr; // Rack number
}
[DllImport("Prodave6.dll")]//连接PLC操作
//参数:连接号(0-63)、常值"S7ONLINE"、待连接plc地址属性表长度(字节为单位,常值9)、待连接plc地址属性表
public extern static int LoadConnection_ex6(int ConNr, string pAccessPoint, int ConTableLen, ref CON_TABLE_TYPE pConTable);
更多精彩
赞助商链接