从C#调用UNIX和Linux共享对象文件.so

12

一个在Unix上编写并构建的用C语言编写的共享对象文件是否可以通过C# P/Invoke调用?

还是我需要使用Java或类似的东西?


2
请提供更多信息...C#是在Mono/Linux上运行还是在Windows上运行? - Yahia
你是在谈论在GNU/Linux上使用Mono吗?还是试图在Windows上这样做? - shelleybutterfly
这个.so文件是你自己的还是第三方的?如果是你自己的,考虑将其移植为Windows DLL;如果是第三方的,请尝试找到一个Windows版本。 - Seva Alekseyev
这个.so文件是我自己的,我计划让它在Windows上运行。 - Natasha Thapa
1
在Windows上运行Windows的.dll(通过C#互操作/DllImport)是可以的。在Linux上运行Linux的.so也可以:http://www.mono-project.com/Interop_with_Native_Libraries。但是在Linux上运行.dll,或者在Windows上运行Linux共享对象,几乎肯定会失败。 - paulsm4
那么对我来说,Java是否是最好的解决方案?我正在尝试包装遗留代码并使用Web服务公开它们。将Java服务托管在Unix盒子上,放在tomcat/weblogic下。 - Natasha Thapa
2个回答

14
Mono有能力在C#内部使用dlopen(3)来与本机库进行集成。只需使用DllImport语句并附上库的名称(例如'libform.so.5'),然后用友好的C#类包装本机代码和数据类型,该类会处理所有低级别的东西。 这个页面 提供了很好的概述,其中包含大量关于如何处理指针和其他不安全类型的信息。
一旦您编写了包装器类,就可以放心使用它,而不必担心它在底层使用本机共享库。

+1 真棒,不知道我在搜索时怎么错过了它。我甚至浏览了 Mono 网站试图找到它。 :| - shelleybutterfly

1

我认为至少没有简单的方法,特别是如果你指的是在Windows上使用C#。在这种情况下,您需要能够解码共享对象并进入其中的代码,类似于GNU / linux的ABI重新实现。此外,任何其他库也必须存在并可用,例如C运行时库等。这可能需要非常大的努力。

至于直接在linux / Mono下执行它,请参见此答案:Calling UNIX and Linux shared object file .so from c#

您还可以尝试查看Open Office所做的事情,http://packages.debian.org/lenny/cli-uno-bridge可能会有所帮助;但这更像是一个接口,而不是直接将两者连接在一起。


那么Java对我来说是最好的解决方案吗?我正在尝试包装旧代码并使用Web服务将其公开,然后在Unix服务器上托管Java服务,使用tomcat / weblogic。 - Natasha Thapa
1
Java不是一个坏选择,但如果你尝试在Unix/Linux上托管它,C#就是一个糟糕的选择。这与语言的能力无关,与工具集的历史和“支持”的概念有很大关系。Java从一开始就是为在Unix/Linux上运行而设计的,具有可工作的分布式和支持的平台。而C#则是为在Unix/Linux上运行而设计的,没有可工作的分布式和支持的平台。虽然一些人已经成功地组建了C#平台,但它们明确标称“自行承担风险”。 - Edwin Buck
你需要知道:看起来我的答案是不正确的;James O'Doherty在https://dev59.com/iGw05IYBdhLWcg3wuUAL#7073354中提供了如何在Linux中使用clopen()的方法。我记得有一种方法,但当我搜索时找不到它,以为自己是想象出来的。至于如何做你想要的事情,恐怕我没有做过类似的事情。但我会在我的答案中添加说,在Linux/Mono中可以(显然很容易)完成。 - shelleybutterfly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接