如何调用linux/c++;具有单声道/C#程序的功能?

如何调用linux/c++;具有单声道/C#程序的功能?,c#,c++,linux,mono,C#,C++,Linux,Mono,我在谷歌上搜索了很多,但找不到解决我的具体问题的方法,至少看起来很具体。 我有以下情况: ARM板上的嵌入式Linux(Debian)。我有“老”C++应用程序运行,通过CAN总线和Sokcan can API发送数据。 但是最近我在C#上做了一些项目,并且非常喜欢.NET框架,这就是为什么我在我的嵌入式系统上安装了Mono。 运行纯C#应用程序没有问题 但现在我想通过Mono/C应用程序访问CAN总线,这似乎是个问题,因为没有socketcan那样的api。这就是为什么我有一个想法,它调用C+

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

ARM板上的嵌入式Linux(Debian)。我有“老”C++应用程序运行,通过CAN总线和Sokcan can API发送数据。 但是最近我在C#上做了一些项目,并且非常喜欢.NET框架,这就是为什么我在我的嵌入式系统上安装了Mono。 运行纯C#应用程序没有问题

但现在我想通过Mono/C应用程序访问CAN总线,这似乎是个问题,因为没有socketcan那样的api。这就是为什么我有一个想法,它调用C++函数来创建和处理基础的socket操作,而我的C语言程序处理数据。p> <>我发现了一些东西,比如调用C++函数,或者编译C++函数/类作为DLL,然后调用它们。问题是,我还没有找到一个解决方案如何将我的SocketCAN/C++程序编译成DLL,因为我的Windows主机上的Visual Studio编译器显然不知道linux内核can实用程序


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

您的库是什么样子的?你能从它们中创建
。那么
?如果是,那么一切都很好。据我所知,MONO可以在适当的级别上处理互操作

请注意,您应该注意调用约定(,),并可能使用完整的表单:

[DllImport("mylib.so", EntryPoint = "my_func1", CallingConvention = CallingConvention::Cdecl,  CharSet = CharSet::Ansi)]
对于您的
extern“C”
我想
Cdecl
是合适的(如果不合适,请检查其他^-^)

从上面的MONO文档链接:

使用C++ Visual C++中的 Cys> CCDLL> <代码>编译器内蕴,并使用<代码> >属性>((STDCALL))< /S>和<代码> >属性>((CDDEL))< /Cord>编译器在GCC下的编译本质。
免责声明:我不使用MONO(我也不知道您使用的是什么C/C++编译器),所以您需要检查它。

您不需要将它编译为dll。您还可以使用常规pinvoke调用(例如).so文件中的函数。请注意,最后,.so对于Linux的作用与.dll对于Windows的作用相同:它们是程序可以使用的动态库。谢谢!我编写了一个lib.so文件,其中包含我的函数,但当我试图用我的c#程序调用它们时,我得到System.EntryPointNotFoundException。我想这是因为我用[code]extern“C”uu declspec(dllexport)[/code]声明了我的函数,这似乎是针对windows的。什么是正确的声明?@rele92我在下面编辑了我的答案