为 .NET 消费定义此本机接口的最佳方式是啥?

Posted

技术标签:

【中文标题】为 .NET 消费定义此本机接口的最佳方式是啥?【英文标题】: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 列表类,而是使用(本机)动态分配的数组。如何看待这种方法?是否太容易出错(关于在托管端释放内存)?这样的界面会通过“笑”的因素吗? 您提出的问题与您在此处发布的问题完全不同。编辑或重新提问。 【参考方案1】:

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

【讨论】:

明天上班时,我会详细说明这一点,除非有人给出更好的答案。 谢谢。我可以从那里拿起碎片......但我想知道这种方法有多“标准”? 好吧,很抱歉完全忘记了这一点,但很高兴知道它在某种程度上很有用。至于“标准性”,我真的不确定!

以上是关于为 .NET 消费定义此本机接口的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为 ASP.NET MVC 项目设置数据访问的最佳方式是啥?

单片机的键盘接口连接分为哪几类?说明各自的工作原理。键盘消抖是啥有哪几种方法

部署 VB.NET 应用程序的最佳方式是啥?

为使用自定义开发客户端制作的 expo 应用程序创建发布 apk 的最佳方法是啥

为自定义 Laravel 包提供数据的最佳方式是啥?

对于使用 Facebook iOS SDK 的混合 SSO 场景,为我们自己的自定义用户记录生成密码/密钥的最佳方式是啥?