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

Just4life 2007-05-23 09:52:09
我在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 里面的数据就没有办法接收,谁知道原因啊?帮我解决一下
...全文
289 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Just4life 2007-05-27
  • 打赏
  • 举报
回复
用类应该没有问题,直接在C里面封装函数来达到这个目的
Qim 2007-05-24
  • 打赏
  • 举报
回复
说明一下.??!!
Mittermeyer 2007-05-24
  • 打赏
  • 举报
回复
碰到过类似的问题,可以参考一下:
http://blog.csdn.net/Mittermeyer/archive/2007/04/27/1586867.aspx
lzuchina 2007-05-24
  • 打赏
  • 举报
回复
为什么啊?
wsd2616412 2007-05-24
  • 打赏
  • 举报
回复
那就来接分了,
Just4life 2007-05-24
  • 打赏
  • 举报
回复
我自己已经解决了
sdl2005lyx 2007-05-24
  • 打赏
  • 举报
回复
那你变通一下:
public class DATA_CONTEXT
{
.......
}

同时,你可以看看MSDN,对Marshal的详细介绍。
Just4life 2007-05-24
  • 打赏
  • 举报
回复
To: sdl2005lyx

你这种方法我试过了,调用Marshal.PtrToStructure(ptr,pSctx)时说pSctx不是类结构,晕
sdl2005lyx 2007-05-24
  • 打赏
  • 举报
回复
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);



Just4life 2007-05-23
  • 打赏
  • 举报
回复
没有人知道吗?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧