【问题标题】:What's the best way to define this native interface for .NET consumption?为 .NET 消费定义此本机接口的最佳方式是什么?
【发布时间】:2012-03-13 22:06:55
【问题描述】:

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

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

变量someListDoSomething 填充。

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

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

这种情况的最佳做法是什么?

【问题讨论】:

  • 您不能通过 pinvoke 将 C++ 类公开给托管代码。只有 C++/CLI 可以在这样的场景中工作。您仍在复制列表元素,除非它是简单类型,否则这是不可避免的。结构并不简单。
  • 谢谢@HansPassant——我可以不使用 STL 列表类,而是使用(本机)动态分配的数组。如何看待这种方法?是否太容易出错(关于在托管端释放内存)?这样的界面会通过“笑”的因素吗?
  • 您提出的问题与您在此处发布的问题完全不同。编辑或重新提问。

标签: c# c++ .net pinvoke marshalling


【解决方案1】:

您可以定义一个用于 pinvoke 调用的结构。将其装饰在原生面和管理面,以使每一面的包装都相同。至于变量 sized out 参数,您可以使用 ::GlobalAlloc 分配一个数组,然后可以在 C# 中释放该数组。也传递一个项目计数。在 C# 中,Marshal 类型有多种方法可用于处理 GlobalAlloc'd 数组。

【讨论】:

  • 明天上班时,我会详细说明这一点,除非有人给出更好的答案。
  • 谢谢。我可以从那里拿起碎片......但我想知道这种方法有多“标准”?
  • 好吧,很抱歉完全忘记了这一点,但很高兴知道它在某种程度上很有用。至于“标准性”,我真的不确定!
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 2011-09-04
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多