日期:2014-05-19  浏览次数:20731 次

关于在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的详细介绍。