1. 添加using System.Runtime.InteropServices;
2. 在C++中的HANDLE被C#中的IntPtr代替
3. 下一段代码中:
[DllImport("XXX.dll", EntryPoint = "OpenPort")]
public static extern int openPort(String name, String baudrate);
EntryPoint = "OpenPort"指明在原DLL中函数的名称,openPort为重声明后的函数名称
4. C++中的指针对应C#中的ref前缀,如:
[DllImport("XXX.dll", EntryPoint = "Receive")]
public static extern int receive(int device, ref OGeneralInfoOutputPackageType pGeneralInfoOutputPkg);
5. 结构体的重声明:
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct OGeneralInfoOutputType { public ushort SrcAddr; public ushort TargetAddr; public ushort Cmd; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public Byte[] uidArr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public Byte[] dataArr; };
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] public struct OGeneralInfoOutputPackageType { public ushort cmdSum; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public OGeneralInfoOutputType[] cmdArr; // 最多可以接收256个帧 };
6. MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。当 MarshalAsAttribute.Value 设置为 ByValArray
时,必须设置 SizeConst 以指示数组中的元素数。当需要区分字符串类型时,ArraySubType 字段可以选择包含数组
元素的 UnmanagedType。此 UnmanagedType 只可用于作为结构中的字段的数组。而SizeConst则是指数组中的元素个
数。这是一个历史问题,因为C#的数据和C++的数据布局方式有很大的不同,然而如果在P/Invoke和COM Interop当中,
又必须要在C#和C++之间传递数据,有的时候,CLR或者说.NET能够自动在两种编程语言之间转换数据,有的时候又不行,
这时候就需要程序员来帮忙告诉.NET怎样转换数据了。