如何从c#调用c++ API

How to call a C++ API from C#

本文关键字:c++ API 调用      更新时间:2023-10-16

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

据我所知。net有三种与本机软件交互的方式:

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

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

  1. 用C写一个包装器,用P/Invoke调用它。这似乎工作量太大了。
  2. 用COM编写一个包装器。我不知道怎么做,除非它非常容易,否则我不愿意学习一项在我看来即将消亡的技术。在c++/CLI中编写一个包装器。这似乎是最少的工作,但仍然很多。

我的问题:

  1. 首先,我想知道为什么。net不允许我简单地使用c++类"原样"?我猜这是记忆的问题管理。如果是的话,我非常愿意写最后一篇,并实现易弃性。据我所知,c++类只是非常奇特的结构,因为P/Invoke支持结构和函数把structs作为第一个参数,为什么不支持呢课吗?

  2. 第二,假设我真的很懒,而且很无聊,乏味,工作时,使用这些DLL的最佳方法是什么?一种可能性直接从c#调用它们是最好的。如果不是,那我就爱一个自动工具来生产包装。同样,dll也可能可能会改变,只是稍微改变,但我还是不愿意被迫改变

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

谢谢

如果你愿意偷懒,我建议你使用一个工具来为你的c++类生成c#包装器。当然,生成这种包装器的工具是SWIG

有关更多信息,请参阅我以前对类似问题的回答

我的理解是,在c++中,类中方法的调用约定相当混乱。在链接器使用的. lib文件级别上,函数名被"装饰"(参见名称修改)。此外,与c#相比,在所有不同的c++实现中,类变量在内存中的布局可能是不同的,这就是为什么互操作封送处理是一个如此重要的主题。所以我猜微软认为有太多低级别的问题,因此难度太大,不值得去做。

我已经使用p/Invoke和COM对象将我的c#链接到c++,但我没有使用c++/CLI。我已经涉足COM很多年了,它非常像它自己的语言。所以如果你从来没有做过COM,我认为你是对的,在这个阶段不值得学习。如果c++/CLI能让你连接到对象,而不是把所有东西都挤进C接口,那么我认为你是对的,这将是最好的途径。