首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于在C#中调用C写的dll的有关问题

2011-12-31 
关于在C#中调用C写的dll的问题我在C中定义了一个函数,如下:typedefstruct{BYTEix[50]BYTEiy[20]UINTiz}

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

热点排行