P /在ubuntu OS中从mono调用g ++

时间:2010-11-05 16:59:56

标签: c# c++ ubuntu mono pinvoke

是否可以在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

2 个答案:

答案 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#端匹配。那是我遇到过最愚蠢问题的地方。