P / Invoke G ++ из моно в ОС Ubuntu - PullRequest
       8

P / Invoke G ++ из моно в ОС Ubuntu

1 голос
/ 05 ноября 2010

Можно ли вызвать функцию исполняемого файла g ++ из mono в Ubuntu?Обратите внимание, что код C ++ и C #, скомпилированный в операционной системе Ubuntu.

Источник приложения 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 #:

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 ]

3 голосов
/ 06 ноября 2010

Вам необходимо скомпилировать библиотеку как разделяемую библиотеку: статическая библиотека не может быть загружена во время выполнения с помощью P / Invoke.Тот факт, что вы добавили функцию main (), предполагает, что вы вместо этого компилируете код в исполняемый файл.Поэтому первое, что вы должны узнать, как скомпилировать разделяемую библиотеку, вы можете попробовать что-то вроде:

gcc -shared -o libtestcpp.so testcpp.cpp

Затем измените имя DllImport на путь к полному имени библиотеки:

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

Другая ошибка, которую вы допустили, не учитывает искажение имен с помощью C ++: здесь более простое решение - экспортировать Sum () как функцию C, окружив ее extern "C" {}.

Для диагностики таких ошибок.часто полезно включить ведение журнала отладки из моно, используя:

MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono yourprog.exe
0 голосов
/ 05 ноября 2010

Пока символ экспортируется и Mono может понимать параметры (достаточно, чтобы собрать данные в / из них), тогда да, вы можете сделать это.Я думаю, что на страницах Mono в PInvoke действительно упоминается, что вы можете вызывать функции, экспортируемые как библиотеками, так и исполняемыми файлами, включая исполняемый файл, который встраивает Mono.

Вам необходимо убедиться, что символ действительно экспортируется, и что более важно,что он не искажен, или вы соответствуете этому на стороне C #.Это место, с которым у меня были самые глупые проблемы.

...