是否可以在Ubuntu中从mono调用g ++可执行文件的功能?请注意,在Ubuntu操作系统中编译的C ++和C#代码。
C ++应用程序源:
#include <stdlib.h>
static int32_t Sum(int32_t a, int32_t b){
return a + b;
}
/*
*
*/
int main(int argc, char** argv) {
return (EXIT_SUCCESS);
}
C#mono应用程序源:
using System;
using System.Runtime.InteropServices;
namespace MonoCsTest
{
class MainClass
{
[DllImport("/home/.../MonoCsTest/bin/Debug/testcpp")]
public static extern Int32 Sum(Int32 a, Int32 b);
public static void Main (string[] args)
{
Console.WriteLine (" 5 + 6 = " + Sum(5,6));
}
}
}
这会抛出DllNotFoundException
答案 0 :(得分:3)
您需要将库编译为共享库:无法在运行时使用P / Invoke加载静态库。 您添加main()函数的事实表明您正在将代码编译为可执行文件。 因此,首先要了解如何编译共享库,您可以尝试以下方法:
gcc -shared -o libtestcpp.so testcpp.cpp
然后将DllImport名称更改为完整库名称的路径:
DllImport("/home/yourlogin/MonoCsTest/bin/Debug/libtestcpp.so")
你犯的另一个错误是不考虑C ++ manadated name mangling:这里更简单的解决方案是将Sum()导出为extern "C" {}
周围的C函数。
要诊断此类错误,使用以下命令从单声道启用调试日志记录通常很有用:
MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono yourprog.exe
答案 1 :(得分:0)
只要导出符号并且Mono可以理解参数(足以将数据封送到/来自它们),那么是的,你可以这样做。我认为PInvoke上的Mono页面实际上提到你可以调用由库和可执行文件导出的函数,包括嵌入Mono的可执行文件。
您需要验证该符号确实正在导出,更重要的是,它不会被破坏或者您在C#端匹配。那是我遇到过最愚蠢问题的地方。