P/Invoke g++ from mono in ubuntu OS

2019-06-06 22:23发布

Is it possible to invoke a g++ executable file's function from mono in Ubuntu? Note that both C++ and C# code compiled in Ubuntu Operation System.

C++ application source:

#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 application source:

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));
  }
 }
}

This throws DllNotFoundException

2条回答
看我几分像从前
2楼-- · 2019-06-06 22:53

As long as a symbol is exported and Mono can understand the parameters (enough to marshal data to/from them), then yes, you can do this. I think the Mono pages on PInvoke actually mention that you can invoke functions exported by both libraries and executables, including an executable that embeds Mono.

You need to verify that the symbol is indeed being exported, and more importantly, that it is not mangled or you match that in the C# side. That's the spot I've had the most stupid problems with.

查看更多
Lonely孤独者°
3楼-- · 2019-06-06 23:07

You need to compile the library as a shared library: a static library can't be loaded at runtime with P/Invoke. The fact that you added a main() function suggests that you're compiling the code into an executable instead. So the first thing for you is to learn how to compile a shared library, you can try something like:

gcc -shared -o libtestcpp.so testcpp.cpp

Then change the DllImport name to the path to the complete library name:

DllImport("/home/yourlogin/MonoCsTest/bin/Debug/libtestcpp.so")

The other mistake you made is not considering the C++ manadated name mangling: the simpler solution here is to export Sum() as a C function surrounding it with extern "C" {}.

To diagnose such mistakes it is often useful to enable the debug logging from mono using:

MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono yourprog.exe
查看更多
登录 后发表回答