2011-08-19 118 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#的信息作爲數組。