我想要执行以下操作: 调用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()。 –
:)这是不明确的代码示例 –