我有一个用 C++ 实现的相当大的系统,我需要与之交互。该系统有一个相当大的 API,许多 C++ DLL。这些 DLL 导出 C++ 类,而不是漂亮的 C 风格 API。我需要从一个新的 C# 项目中使用它们。
据我所知,.NET 有三种与本机软件交互的方式:
- P/Invoke - 仅适用于 C API
- COM 对象
- C++/CLI
所以我理解它的方式,我有相应的三种方法:
- 用 C 编写一个包装器并用 P/Invoke 调用它。这似乎工作太多了。
- 用 COM 编写包装器。我不知道该怎么做,除非它非常容易,否则我不愿意学习对我来说似乎是一种垂死的技术。
- 用 C++/CLI 编写包装器。这似乎是最少的工作,但仍然很多。
我的问题:
首先,我想知道为什么.NET 不允许我简单地“按原样”使用 C++ 类?我假设这是内存管理的问题。如果是的话,我非常愿意编写终结器并实现 IDisposable 。据我所知,C++ 类只是非常花哨的结构,而且由于 P/Invoke 支持结构,以及将结构作为第一个参数的函数,为什么不支持类呢?
其次,假设我真的很懒,而且工作很无聊,乏味,那么使用这些 DLL 的最佳方法是什么?直接从 C# 调用它们的可能性是最好的。如果没有,那么我会喜欢一个自动工具来生产包装器。此外,DLL 可能会改变,可能只是轻微的但仍然,id 而不是被迫手动重新编写包装器。
对于一个非常好的答案,特别是在第一部分,或者一个好的自动工具,我会奖励赏金......
谢谢