++dll函数代码如下: 结构体原形:
typedef struct MY_DATA
{
char NexPacLen[5]; int DataSort;
int CommType;
char *DataBuff;
} MY_DATATYPE; C#结构体如下:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MY_DATA
{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 5)]
public char[] NexPacLen;
public int DataSort;
public int CommType;
//public IntPtr Databuff;
};问题出在新增的域,char型数组上;
而对应C#中默认的 char型是UNICODE,1个字符占2个字节,C++里的char型占1个字节的;
要怎么修饰呢?前面的布局修饰加和不加一样的嘛?!彻底崩溃,为啥要搞ansi,unicode2种那么麻烦啊,有没有搞错啊5555555555555555555谁来帮我看看呀
高手快入啊问题补充,我试了string,String,StringBuilder,byte[],没一样OK的。。太烦人了
快被类型转换搞死了。。
typedef struct MY_DATA
{
char NexPacLen[5]; int DataSort;
int CommType;
char *DataBuff;
} MY_DATATYPE; C#结构体如下:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MY_DATA
{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 5)]
public char[] NexPacLen;
public int DataSort;
public int CommType;
//public IntPtr Databuff;
};问题出在新增的域,char型数组上;
而对应C#中默认的 char型是UNICODE,1个字符占2个字节,C++里的char型占1个字节的;
要怎么修饰呢?前面的布局修饰加和不加一样的嘛?!彻底崩溃,为啥要搞ansi,unicode2种那么麻烦啊,有没有搞错啊5555555555555555555谁来帮我看看呀
高手快入啊问题补充,我试了string,String,StringBuilder,byte[],没一样OK的。。太烦人了
快被类型转换搞死了。。
public struct MY_DATA
{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 5)]
public byte[] NexPacLen;
public int DataSort;
public int CommType;
public IntPtr Databuff;
};如果在C++中MY_DATA的长度是20,那你就将Packet=1改为4。
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
public struct MY_DATA {
/// char[5]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=5)]
public string NexPacLen;
/// int
public int DataSort;
/// int
public int CommType;
/// char*
public System.IntPtr DataBuff;
}这个不知道成不
555
[StructLayout(LayoutKind.Sequential,Packet=4, CharSet = CharSet.Ansi)]
public struct MY_DATA
{
[MarshalAs(UnmanagedType.ByValTStr,SizeConst = 5)]
public byte[] NexPacLen;
public int DataSort;
public int CommType;
public IntPtr Databuff;
};在C++中MY_DATA的长度是20,改为Packet=4。
另外把你调用的这个DLL函数的接口也贴出来看看.
{
return msd;//MY_DATATYPE类型数据
}
typedef struct MY_DATA
{
char NexPacLen[5];int DataSort;
int CommType;
char *DataBuff;
} MY_DATATYPE; *******************************************************************
public byte[] NexPacLen;//这个我也试了,不行,我查了,对应C++类型好像是BYTE,不是char;
***********************************************************************
我现在的问题是,不知道怎么修饰c#结构体里char类型,修饰它为ansi类型,我想应该会成功的;
我觉得问题出在unicode与ansi之间你们说呢??
另外把你调用的这个DLL函数的接口也贴出来看看.
{
return msd;//MY_DATATYPE类型数据
}
typedef struct MY_DATA
{
char NexPacLen[5];int DataSort;
int CommType;
char *DataBuff;
} MY_DATATYPE; C#代码
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi,Pack = 4)]
public struct MY_DATA
{
//[MarshalAs(UnmanagedType.AnsiBStr,SizeConst=5)]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=5)]
public byte[] NexPacLen;
public int DataSort;
public int CommType;
public IntPtr Databuff;
}
这样写吗?
还是不行哦~~继续请教高手~~~
void SendBufTo(&MY_DATATYPE msd)
{}C#委任是不是这样声明:
public delegate void SendBuffTo(ref MY_DATATYPE mssd);- . - ~~~~
可以这样写吗?要不哪位高手给个例子我看看哈。。
如果可以,你把DLL的源码发出来看看?
这样就可以了
http://topic.csdn.net/u/20100308/16/ef639120-ae8c-41f5-9d5d-e9b57e17a302.html一般系统的API对结构体也是以ref的方式来进行传递的。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MY_DATA
{ /// char[5]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string NexPacLen; /// int
public int DataSort; /// int
public int CommType; /// char*
public IntPtr DataBuff;
}委任声明:
public delegate void SendBuffTo(ref MY_DATA mssd);结构体变量初始化:
MY_DATA mssd;
mssd.DataSort = 0;
mssd.CommType = 0;
mssd.NexPacLen = "9999";
mssd.DataBuff = new IntPtr();调用:
SendBuffTo sbt = (SendBuffTo)DllWrap.GetDelegateFromInt(FunSenBuf, typeof(SendBuffTo));
sbt(ref mssd);C++代码: void SendBuffTo(MY_DATATYPE &mssd)
{
if(MY_EMPTY!=msd.DataSort&&0!=msd.DataSort)
{
mssd.DataSort = msd.DataSort;
mssd.CommType = msd.CommType;
strcpy_s(&mssd.NexPacLen[0],5,&msd.NexPacLen[0]);
mssd.DataBuff = msd.DataBuff;
//strcpy_s(mssd.DataBuff,MYBUFFSIZE*sizeof(char),msd.DataBuff);
//同志们注意,这里因为C#里是没有这样给指针建立堆栈空间方法的,这样赋值用其他代码调会出debug assertion failed,所以直接将指针地址传出去就OK了; }
}经过测试,能C#中已能正确解析C++中的结构体了,哈哈
不过还有点担心,毕竟C++中BUFF是直接给的地址,不清楚C#new intptr对象的时候具体干了什么,有无更安全的C#初始化方法,我这样的代码会出问题吗?(现在暂时没问题)给分结贴咯~~~