我用谷歌搜索了很多,但找不到解决我非常具体问题的方法,至少它看起来非常具体。 我有以下情况:
在 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++编译器),所以你需要检查它。