繁体   English   中英

p / invoke返回指向struct的指针的C函数

[英]p/invoke C function that returns pointer to a struct

如何在C#中声明一个返回指向结构的指针的C函数?

我相信以下是一种方法,然后是Marshal.PtrToStructure来获得实际的结构价值。

// C-function
SimpleStruct * Function(void);

// C# import
[DllImport("MyDll.dll")]
public static extern IntPtr Function();
  1. 我对此是否正确?
  2. 还有其他方法可以实现同样的目标吗? (可以按值获取struct)

由于函数返回一个指针(希望不是本地分配的?),你最好的选择是手动封送它(通过Marshal.PtrToStructure )。

如果它是一个参数,您可以使用PInvoke Interop Assistant创建结构的托管版本,然后通过ref或out传递它。

警告:只有当返回的指针指向已由CLR管理的内存时,这才有效

我相信你在寻找的是

// C# import
[DllImport("MyDll.dll")]
[return : MarshalAs(UnmanagedType.LPStruct)]
public static extern StructureName Function();

[StructLayout(LayoutKind.Sequential)]
public class StructureName {}

这应该不需要任何手动Marshal.PtrToStructure调用。 根据您的结构包含的内容,您可能需要根据需要使用MarshalAs属性标记某些字段。 MSDN就是一个很好的例子。

我根本不是这里的专家,但我碰巧看到的是一段代码(我完全不明白你这么做)。

这是他们正在做的事情

[DllImport("")]
private static extern short MethodName([In,Out] ref StructureName variable);

然后在结构上他们有以下属性

[StructLayout(LayoutKind.Sequential, Size = #)]
public struct StructureName {}

我认为你要找的部分是[In,Out]部分,因为它是通过ref传递的,所以你应该得到相同的数据。

标记为社区维基,以便人们可以解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM