我想要執行以下操作: 調用Unamanaged方法,該方法返回它分配的類型爲MyStruct []的數組。 C代碼從非託管代碼返回分配的值到託管
例子:
MyStruct[] foo(int size)
{
Mystruct* st = (MyStruct*)malloc(size * sizeof(MyStruct));
return st;
}
應該如何實現C#調用的方法?
謝謝!
我想要執行以下操作: 調用Unamanaged方法,該方法返回它分配的類型爲MyStruct []的數組。 C代碼從非託管代碼返回分配的值到託管
例子:
MyStruct[] foo(int size)
{
Mystruct* st = (MyStruct*)malloc(size * sizeof(MyStruct));
return st;
}
應該如何實現C#調用的方法?
謝謝!
在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#我們無法釋放該內存,您將不得不提供另一種方法釋放分配的內存。
謝謝Martin非常清楚地解釋 –
閱讀,我還沒有找到如何返回數組類型的meclared結構 –
它沒有直接的解決方案,解決辦法可以傳遞數組,並讓庫填充它併發回。這裏解釋http://answers.unity3d.com/questions/132083/returning-a-byte-array-from-objc-to-c-script-on-io.html – Zenwalker
參考this thread,它有一些關於如何將一個動態分配的結構從C++返回給C#的信息作爲數組。
我想使用unmanaged.dll編寫的現有算法,並希望得到結果:) –
該代碼沒有做任何有用的事情。不妨使用Marshal.AllocCoTaskMem()。 –
:)這是不明確的代碼示例 –