c# - 为 .NET 使用定义此 native 接口(interface)的最佳方法是什么?

标签 c# c++ .net pinvoke marshalling

我有一个库,我希望最终将其功能公开给 .NET。我想要公开的方法具有以下签名:

void DoSomething(std::list<SomeStruct>& someList);

变量someList填充为 DoSomething .

我已经知道如何从库导出了。我的主要问题是这个功能的“.NET 友好”界面是什么样的?我假设 std::list如果我想将 C# 与 P/Invokes 一起使用,这是一个坏主意。

还有什么其他选择?作为调用者,我不会知道应该提前传入的缓冲区的大小。另外,作为调用者,我不想对具有小型固定大小缓冲区的函数进行多次调用,也不想传递超大缓冲区。

此案例的最佳实践是什么?

最佳答案

您可以定义一个结构体以在 pinvoke 调用中使用。在 native 面和管理面进行装饰,以便每一面的包装相同。对于可变大小的 out 参数,您可以使用::GlobalAlloc 来分配一个数组,然后可以在 C# 中释放该数组。还传递项目计数。在 C# 中,Marshal 类型有多种方法可用于处理 GlobalAlloc'd 数组。

关于c# - 为 .NET 使用定义此 native 接口(interface)的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692959/

相关文章:

c# - 无法使用 HTTP POST 上传文件

c# - 如何选择多张照片?

c++ - 模板对象作为模板类的静态成员

c++ - 这个例子在 Bjarne Stroustrup 的 C++ 编程语言中是如何工作的?

c# - 交换单个链表上的节点

c# - 触发 OnPropertyChanged 的​​更好方法

c++ - 管理生命周期

c# - 请向我解释一下这个 SerializationException

Dot Net 中的 Android 应用内计费收据验证(C#)

C#:在何处实现自定义 IEnumerator<T>