15

我有一个用 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 支持结构,以及将结构作为第一个参数的函数,为什么不支持类呢?

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

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

谢谢

4

2 回答 2

6

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

有关更多信息,请参阅我对类似问题的旧答案

于 2013-04-05T08:32:53.830 回答
0

我理解它的方式,在 C++ 中,类中方法的调用约定非常混乱。在链接器使用的 .LIB 文件级别,函数名称得到“修饰”(参见例如Name mangling)。此外,与 C# 相比,C++ 的所有不同实现之间的内存中类变量的布局可能都不同,这就是为什么Interop Marshaling是一个如此大的话题。所以我的猜测是,微软认为有太多的低级问题,因此太难了,以至于不值得。

我已经使用 P/Invoke 和 COM 对象将我的 C# 链接到 C++,但我没有使用 C++/CLI。多年来我一直在涉足 COM,它非常像它自己的语言。因此,如果您从未做过任何 COM,我认为您是对的,现阶段不值得学习它。如果 C++/CLI 可以让您与对象交互,而不必通过 C 接口压缩所有内容,那么我认为您是对的,这将是最佳途径。

于 2013-04-05T08:27:20.767 回答