如何使用Mono / C#程序调用Linux / C ++函数?



我用谷歌搜索了很多,但找不到解决我非常具体问题的方法,至少它看起来非常具体。 我有以下情况:

在 ARM 板上嵌入 Linux (Debian)。我正在运行"旧"C++应用程序,它们通过CAN总线和SocketCAN API发送和接收数据。

但最近我用C#做了几个项目,真的很喜欢.NET Framework,这就是我在嵌入式系统上安装Mono的原因。 运行纯 C# 应用程序没有问题。

但是现在我想通过单声道/C#应用程序访问CAN总线,这似乎是一个问题,因为没有api作为socketcan。这就是为什么我想调用 c++ 函数来创建和处理底层 Socket 操作,而我的 C# 程序处理数据。

我发现了诸如调用c ++函数之类的事情,或者将c ++函数/类编译为DLL并用C#调用它们。问题是,我还没有找到如何将我的SocketCAN/C++程序编译为DLL的解决方案,因为我的主机Windows机器上的Visual Studio编译器显然无法知道linux内核可以实用程序。

那么有人知道我该如何解决这个问题吗? 我可以看到可能有更多的解决方案,但我无法弄清楚一个。

你们的库是什么样的?你能从他们那里创造.so吗?如果是,那么一切都很好。据我所知,MONO 可以在适当的级别处理互操作。

单声道互操作

请注意,您应该关心调用约定(link1,link2),并且可能使用完整形式:

[DllImport("mylib.so", EntryPoint = "my_func1", CallingConvention = CallingConvention::Cdecl,  CharSet = CharSet::Ansi)]

对于您的extern "C"我想Cdecl是合适的(如果没有,请检查其他^-^)

从上面的单声道文档链接:

调用约定可以在 C 代码中指定,方法是使用 Visual C++ 下的__stdcall__cdecl编译器内部函数Microsoft并使用 GCC 下的__attribute__((stdcall))__attribute__((cdecl))编译器内部函数。

免责声明:我不使用单声道(我也不知道你使用什么C/C++编译器),所以你需要检查它。

最新更新