如何从C#调用C++ API

AK_*_*AK_ 15 c# c++ dll pinvoke interop

我有一个用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而不是强制手动重写包装器.

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

谢谢

use*_*511 6

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

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