c# - 如何从 C# 调用 C++ API

标签 c# c++ dll interop pinvoke

我有一个用 C++ 实现的非常大的系统,我需要与之交互。该系统有一个相当大的 API,许多 C++ DLL。这些 DLL 导出 C++ 类,而不是漂亮的 C 风格 API。我需要在一个新的 C# 项目中使用它们。

据我所知,.NET 具有三种与本地软件交互的方式:

  1. P/Invoke - 仅适用于 C API
  2. COM 对象
  3. C++/CLI

所以按照我的理解,我有相应的三种方法:

  1. 用 C 语言编写一个包装器并使用 P/Invoke 调用它。这似乎工作太多了。
  2. 使用 COM 编写包装器。我不知道该怎么做,除非它非常容易,否则我不愿意学习在我看来是一种垂死的技术。
  3. 使用 C++/CLI 编写包装器。这似乎是最少的工作,但仍然很多。

我的问题:

  1. 首先我想知道为什么.NET 不允许我简单地 “按原样”使用 C++ 类?我假设这是一个内存问题 管理。如果是我非常愿意编写终结器, 并实现 IDisposable 。据我所知,C++ 类只是 非常花哨的结构,因为 P/Invoke 支持结构和函数 以structs作为第一个参数,为什么不支持 上课?

  2. 其次,假设我真的很懒,而且很无聊,乏味, 工作,使用这些 DLL 的最佳方法是什么?一个潜在可能 直接从 C# 调用它们是最好的。如果不是那么我会 喜欢生产 wrapper 的自动工具。此外,DLL 可能 改变,可能,只是稍微但仍然,我宁愿不要被迫 手动重写包装器。

对于一个非常好的答案,特别是在第一部分,或者一个好的自动工具,我会奖励赏金......

谢谢

最佳答案

如果您愿意采取懒惰的方式,我建议您使用工具为您的 C++ 类生成 C# 包装器。当然生成这样一个包装器的工具是SWIG

有关详细信息,请参阅我对 similar question 的旧回答

关于c# - 如何从 C# 调用 C++ API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15822788/

相关文章:

c# - .NET正则表达式识别 `if .. then .. else .. endif`

c# - WPF 将 slider 和文本框值绑定(bind)到静态 int 值

c++ - G++ 模板实例化导致 "Undefined reference to"错误

windows - 加载dll失败。找不到指定的模块

C# 漂亮的代码打印库

c# - 所需的内存和数据结构布局

c# - 特定范围内的随机颜色生成

c++ - 将 C++ 程序的输出通过管道传递给另一个程序

c++ - 执行另一个目录中的文件

c# - dotnet dll反编译并修改代码