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

时间:2009-04-22 22:01:57

标签: c# interop pinvoke

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

我认为以下是一种方法,然后使用 Marshal.PtrToStructure 来获取实际结构值。

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

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

3 个答案:

答案 0 :(得分:4)

由于函数返回一个指针(希望不是本地分配的指针?),最好的办法是手动编组(通过Marshal.PtrToStructure)。

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

答案 1 :(得分:4)

警告:只有当返回的指针指向已由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就是一个很好的例子。

答案 2 :(得分:0)

我根本不是这里的专家,但我碰巧看到的是一段代码(我完全不明白你的意思)也在做同样的事情。

这是他们正在做的事情

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

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

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

我认为您正在寻找的部分是[In,Out]部分,并且由于它是通过ref传递的,因此您应该获得相同的数据。

标记为社区维基,以便人们可以在错误时解决此问题。