关于在C#中调用C写的dll的问题
我在C中定义了一个函数,如下:
typedef struct {
BYTE ix[50];
BYTE iy[20];
UINT iz;
}DATA_CONTEXT;
unsigned int AccessKey( DATA_CONTEXT *&pSctx);
在C#中声明如下:
public static extern uint AccessKey( ref DATA_CONTEXT [] pSctx);
在调用的时候发现,当AccessKey只返回一个DATA_CONTEXT 结构体大小的数据时没有问题,但是如果返回的数据长度是2个sizeof(DATA_CONTEXT )时,第二个DATA_CONTEXT 里面的数据就没有办法接收,谁知道原因啊?帮我解决一下
------解决方案--------------------碰到过类似的问题,可以参考一下:
http://blog.csdn.net/Mittermeyer/archive/2007/04/27/1586867.aspx
------解决方案--------------------lz:解决办法如下:
1、写C#对应的结构
[StructLayout(LayoutKind.Explicit, Size=86, CharSet=CharSet.Ansi)]
public struct DATA_CONTEXT
{
[FieldOffset(0)]public byte[] ix;
[FieldOffset(51)]public byte[] iy;
[FieldOffset(71)]public uint iz;
}
2、借助IntPtr指针传递
因为返回的数组是变长的,所以DllImport函数声明不能用数组作返回类型。
必须使用IntPtr指针做返回值,然后用Marshal.PtrToStructure读取结构内容。
代码如下:
声明:
public static extern uint AccessKey(IntPtr pData);
使用:
DATA_CONTEXT[] pSctx=new DATA_CONTEXT[pData.Size/86];
IntPtr ptr=IntPtr.Zero;
uint n = AccessKey(ptr);
Marshal.PtrToStructure(ptr,pSctx);
------解决方案--------------------那你变通一下:
public class DATA_CONTEXT
{
.......
}
同时,你可以看看MSDN,对Marshal的详细介绍。