[英]pinvoke get data from struct in c
我在正在构建的项目中使用pinvoke
。 我需要从C中的函数获取数据,该函数获取指向结构的指针。 在我的C#中,我做了一个具有适当属性的类(layountkind.sequntial)。 在执行此功能之前:
mystruct str=new mystruct();
str.Data=new byte[14];
func(str);
我在函数中填充了该结构,但是当它退出该函数时,该类的实例没有在c中填充的值,因此我在退出c函数之前检查了指针的内容,并且它具有正确的值。 下面是该函数的原型:
[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
void func([MarshalAs(UnmanagedType.LPStruct)] mystruct str);
我在C#中的结构:
[StructLayout(LayoutKind.Sequential)]
public class mystruct
{
public ushort familiy;
[MatshalAs(UnmanagedType.ByValArray,SizeConst=14)]
public byte [] data;
}
C中的功能和结构:
struct sockaddr{
unsigned short familiy;
char data [14];
};
void func(struct sockaddr *info)
{
int i;
char buffer[100]
recvfrom(sockfd,buffer,0,info,&i);//assume i have a global varible sockfd and it is an open socket
}
我该如何解决我的问题?
p / invoke声明不正确。 默认编组是In
唯一的。 但是您需要进行Out
编组。 否则,封送处理程序将不会尝试将非托管函数设置的数据封送回托管类。
因此,您可以通过声明如下函数来解决问题:
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void func([Out] mystruct str);
我个人认为使用C#结构会更惯用。 我会这样声明:
[StructLayout(LayoutKind.Sequential)]
public struct mystruct
{
public ushort family;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=14)]
public byte[] data;
}
然后函数变为:
[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
static extern void func(out mystruct str);
调用很简单:
mystruct str;
func(out str);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.