C#string转c++ char*
C#使用IntPtr类型接受Marshal.StringToHGlobalAnsi分配的内存。
string sno = ""12345;
IntPtr strsno = Marshal.StringToHGlobalAnsi(sno);
Marshal.FreeHGlobal(strsno);//必须释放
IntPtr转string
string msg = Marshal.PtrToStringAnsi((IntPtr)pmsg);
结构体的转换 c#结构体和对应的c++结构体如下
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct SerialPort
{
public byte comno;
public byte btParity;
public byte btByteSize;
public byte btStopBits;
public uint dwBaudRate;
};
typedef struct tagSerialPort
{
unsigned char comno;
unsigned char btParity;
unsigned char btByteSize;
unsigned char btStopBits;
unsigned int dwBaudRate;
} _SERIAL_PORT;
转换代码如下
SerialPort SerialPort = new SerialPort();
SerialPort.comno = (byte)4;
SerialPort.dwBaudRate = 15200;
SerialPort.btStopBits = (byte)0;
SerialPort.btByteSize = (byte)8;
SerialPort.btParity = (byte)0;
//convert
IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(SerialPort));
IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(SerialPort));
Marshal.StructureToPtr(SerialPort, structPtr, false);
Marshal.FreeHGlobal(structPtr);//释放
如果c++结构体中有数组,最常见的为char[],改如何定义呢
我们再看一个数据库信息的结构体
c++定义的结构体如下
#define IP_SIZE 16
#define NAME_SIZE 32
typedef struct DatabaseInfo
{
char szDbName[NAME_SIZE];
char szDbIP[IP_SIZE];
char szUser[NAME_SIZE];
char szPWd[NAME_SIZE];
int nPort;
char szCharacter[IP_SIZE];
int nType;
} _DatabaseInfo;
C#结构体定义时,用string对应char[],但是一定要指定长度。
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct DatabaseInfo
{
//字符串,SizeConst为字符串的最大长度
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string szDbName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szDbIP;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string szUser;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string szPWd;
public int nPort;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string szCharacter;
public int nType;
//int数组,SizeConst表示数组的个数,在转换成
//byte数组前必须先初始化数组,再使用,初始化
//的数组长度必须和SizeConst一致,例test = new int[6];
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
//public int[] test;
}
转换代码如下
DatabaseInfo dbInfo = new DatabaseInfo();
dbInfo.szDbName ="igpsport";
//.....dbInfo赋值
//分配结构体大小的内存空间
int size = Marshal.SizeOf(dbInfo);
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(dbInfo, structPtr, false);
//do something
//释放内存空间
Marshal.FreeHGlobal(structPtr);
C#中IntPtr为null的判断
//声明空指针
IntPtr pAdd = IntPtr.Zero;
if(pAdd == IntPtr.Zero)
{
}