我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内核可以使用实用程序。
那么有人知道如何解决这个问题吗?我可以看到可能有更多的解决方案,但我找不到一个。
答案 0 :(得分:1)
您的图书馆是什么样的?你能从他们那里创建.so
吗?如果是,那么一切都很好。据我所知,MONO可以在适当的级别上处理互操作。
请注意,您应该关注调用约定(link1,link2),并且可能使用完整格式:
[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 ++编译器)所以你需要检查它。