gpt4 book ai didi

c# - 将分配的值从非托管代码返回到托管代码

转载 作者:太空狗 更新时间:2023-10-29 16:03:48 27 4
gpt4 key购买 nike

我想做以下事情:调用 Unamanaged 方法,该方法返回它分配的 MyStruct[] 类型的数组。

C代码示例:

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

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

谢谢!

最佳答案

Marshal System.Runtime.InteropServices 命名空间中的类有很多方法可以帮助您将数据编码到非托管代码或从非托管代码编码数据。

您需要声明您的本地方法:

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

还有您的 C 结构作为托管值类型(您可以在字段上使用属性来准确控制它们在编码时如何映射到 native 内存):

[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# 我们无法释放该内存,您必须提供另一种方法来释放分配的内存。

关于c# - 将分配的值从非托管代码返回到托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7122861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com