如何从c#调用c++ API
How to call a C++ API from C#
我有一个用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++类"原样"?我猜这是记忆的问题管理。如果是的话,我非常愿意写最后一篇,并实现易弃性。据我所知,c++类只是非常奇特的结构,因为P/Invoke支持结构和函数把structs作为第一个参数,为什么不支持呢课吗?
-
第二,假设我真的很懒,而且很无聊,乏味,工作时,使用这些DLL的最佳方法是什么?一种可能性直接从c#调用它们是最好的。如果不是,那我就爱一个自动工具来生产包装。同样,dll也可能可能会改变,只是稍微改变,但我还是不愿意被迫改变
对于一个非常好的答案,特别是第一部分,或者一个好的自动工具,我将奖励一个赏金…
谢谢
如果你愿意偷懒,我建议你使用一个工具来为你的c++类生成c#包装器。当然,生成这种包装器的工具是SWIG
有关更多信息,请参阅我以前对类似问题的回答
我的理解是,在c++中,类中方法的调用约定相当混乱。在链接器使用的. lib文件级别上,函数名被"装饰"(参见名称修改)。此外,与c#相比,在所有不同的c++实现中,类变量在内存中的布局可能是不同的,这就是为什么互操作封送处理是一个如此重要的主题。所以我猜微软认为有太多低级别的问题,因此难度太大,不值得去做。
我已经使用p/Invoke和COM对象将我的c#链接到c++,但我没有使用c++/CLI。我已经涉足COM很多年了,它非常像它自己的语言。所以如果你从来没有做过COM,我认为你是对的,在这个阶段不值得学习。如果c++/CLI能让你连接到对象,而不是把所有东西都挤进C接口,那么我认为你是对的,这将是最好的途径。
- 用于访问容器<T>数据成员的正确 API
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++MySQL C api用户输入行
- 如何使用 AWS Transcribe C++ API 中的'StartTranscriptionJobRequest'?
- 将std::string传递给WriteConsole API
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 在gtest.中使用fff.h模拟系统API
- 有没有任务栏API可以立即应用注册表更改
- C++win32 API创建多个类似视口的窗口
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 如何将真正的字符串从python c-api转换为python脚本
- 使用Qt框架在c ++类中创建API调用
- Libreoffice API (UNO):需要更改用户的 xTextField 文本
- 使用 WIN32 API (C/C++) 对特定树视图项进行着色
- 使用 Python Extension API 包装复杂C++类
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- 第三方 API 中的编译错误 - Visual Studio
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- Issues with Win32 ReadProcessMemory API