【问题标题】:Easiest way to generate P/Invoke code?生成 P/Invoke 代码的最简单方法是什么?
【发布时间】:2013-04-08 20:21:03
【问题描述】:

我是一位经验丰富的 .Net 程序员,但我一生中没有编译过 C/C++ 程序。现在我有了这个 C-dll、头文件和文档(第 3 方,不是来自 Win API),我需要从中调用大约十个方法。

我正在考虑使用 Platform Invoke。我找到了这三个可以为我创建代码的工具:

可能

Pinvoker 的方法似乎与互操作助手和向导有点不同。在检查这里没有问过这个问题时,我刚刚发现了 Swig。

这些工具的优缺点是什么?

鉴于我对 C/C++ 了解不多,对我来说生成 P/Invoke 代码的最佳 = 最简单和最安全的方法是什么?

【问题讨论】:

标签: c# c pinvoke


【解决方案1】:

有关互操作示例,请参阅 http://dotnetperls.com/dllimport-interop,有关更多信息,请参阅 MSDN article。这东西的圣经是Adam Nathan'sbook

基本上,您需要确定要调用的 DLL 中的函数。这些需要用 extern 标记以使它们可以被外界访问。可能会变得棘手的下一步是为该函数编写一个 DllImport。这需要在托管和非托管世界之间进行映射。您将需要弄清楚如何将任何复杂的数据结构从 C dll 编组到托管代码中。

您应该检查 DLL 是否有任何类型的 COM 接口。确保您确实需要先使用 P/Invoke。

SWIG 最初用于包装 C/C++ 代码以供脚本语言使用。它根据接口描述生成 C# 代码(请参阅tutorial)。如果 P/Invoke 是一个选项,我不建议在 C# 中使用它。

【讨论】:

  • 不,没有 COM 接口。需要调用原生 C-dll。
【解决方案2】:

如果函数的签名很简单,那么设置应该需要 10 分钟 - 即如果它们需要 2 个 char * 并返回一个 int。只有当它们变得复杂时,它才会变得混乱

pinvoke 上的圣经是Adam Nathans - .NET and COM: The Complete Interoperability Guide

我同意其他海报 - 痛饮不是正确的事情

【讨论】:

  • 接口并不简单:复杂的输入和输出结构。或者不是超级复杂,但每次调用中有 3-6 个参数,其中一些结构具有多个参数。所以我真的很想得到一代人的帮助。
  • 你能把函数签名贴在这里吗?你可以在某种程度上混淆它们。
  • 我需要检查一下。但是签名(+ 相关结构)大约有 100 行。你是说这些生成工具从根本上说是不好的(如果是这样,为什么?)。或者我为什么要逐行逐个参数地手动完成所有这些工作,而不是使用这些工具?
  • @Ope 因为这些工具 (swig) 不适用于原始 C++ 头文件,但适用于您必须编写、维护和生成 C++ 头和 .cs 文件的特殊语言中间文件从。因此,与仅解析和转换原始 C++ 标头的工具相比,它不自然并且感觉笨拙。
猜你喜欢
  • 2014-10-19
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2012-01-05
相关资源
最近更新 更多