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

时间:2017-03-20 10:28:20

标签: c# c++ linux mono

我google了很多但是找不到解决我这个特定问题的方法,至少看起来非常具体。 我有以下情况:

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

但是最近我在C#中开展了一些项目,并且非常喜欢.NET Framework,这就是我在嵌入式系统上安装Mono的原因。 运行纯C#应用程序没问题。

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

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

那么有人知道如何解决这个问题吗?我可以看到可能有更多的解决方案,但我找不到一个。

1 个答案:

答案 0 :(得分:1)

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

MONO Interop

请注意,您应该关注调用约定(link1link2),并且可能使用完整格式:

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

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

从上面的MONO文档链接:

  

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

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