2011-08-19 104 views
3

我想要执行以下操作: 调用Unamanaged方法,该方法返回它分配的类型为MyStruct []的数组。 C代码从非托管代码返回分配的值到托管

例子:

MyStruct[] foo(int size) 
{ 
    Mystruct* st = (MyStruct*)malloc(size * sizeof(MyStruct)); 
    return st; 
} 

应该如何实现C#调用的方法?

谢谢!

+0

我想使用unmanaged.dll编写的现有算法,并希望得到结果:) –

+0

该代码没有做任何有用的事情。不妨使用Marshal.AllocCoTaskMem()。 –

+0

:)这是不明确的代码示例 –

回答

5

System.Runtime.InteropServices命名空间中的类Marshal有很多的方法来帮助您元帅的数据,并从非托管代码。

您必须声明你的本地方法:

[DllImport("myclib.dll")] 
public static extern IntPtr Foo(Int32 size); 

,也是你的C结构作为托管值类型(你可以使用上的字段属性来控制它们究竟是如何映射到时,他们本机内存编组):

[StructLayout(LayoutKind.Sequential)] 
struct MyStruct { 
    public Char Character; 
    public Int32 Number; 
} 

然后可以使用Marshal.PtrToStructure到阵列中的每个元素编组到托管值:

var n = 12; 
var pointer = Foo(n); 
var array = new MyStruct[n]; 
var structSize = Marshal.SizeOf(typeof(MyStruct)); 
for (var i = 0; i < n; ++i) { 
    array[i] = (MyStruct) Marshal.PtrToStructure(pointer, typeof(MyStruct)); 
    pointer += structSize; 
} 

请注意,您正在使用malloc在C代码中分配内存。 C#我们无法释放该内存,您将不得不提供另一种方法释放分配的内存。

+0

谢谢Martin非常清楚地解释 –

1

参考this thread,它有一些关于如何将一个动态分配的结构从C++返回给C#的信息作为数组。