2015-06-23 4 views
-2

Я пытаюсь использовать P метод/Invoke на Mono с помощью Ubuntu 14.04:Проверьте P/Invoke была успешной

C++ часть:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport) 

EXTERN_DLL_EXPORT int SomeMethod(int num); 

// and .cpp file with the actual implementation 

C# часть:

[DllImport(@"TestProj")] 
extern static int SomeMethod(int n); 

Console.WriteLine(SomeMethod(2)); 

Однако, если я пытаюсь вызвать метод, я всегда получаю NullReferenceException, мне интересно, как я могу узнать, было ли возбуждено исключение, потому что P/Invoke не удалось, возможно, потому, что он не смог правильно загрузить метод или null ref фактически произошло внутри SomeMethod.

Благодаря

ответ

1

Если общий (родной) библиотека не найдена, вы получите:

XXXXX failed to initialize, the exception is: System.DllNotFoundException 

Если у вас есть несоответствие точек входа вы получите:

XXXXX failed to initialize, the exception is: System.EntryPointNotFoundException 

If в общей библиотеке произошел сбой, вы никогда не получите фреймворк null ref.

Так что .so загружается и функция 'c' вызывается, но что-то в моно-каркасе бросает подгонку. Marshaling interop - это первое место, которое я бы посмотрел. Существует некоторая несоответствие между тем, что вы переходите с C# на Cpp или обратно ... Если образец, который вы даете, является истинным, просто «int», а не указатели/структуры/etc ... тогда он должен просто работать.

Простейший случай HelloWorld Interop я могу создать, дать ему истинное и посмотреть, что происходит:

кошка countbyone.cpp

extern "C" int SomeMethod(int num) { 
    return num++; 
} 
  • НКУ -g - shared -fPIC countbyone.cpp -o libcountbyone.so

  • или OS-X:
  • лязг -dynamiclib countbyone.cpp -o libcoutbyone.dylib

кошка interop.cs

using System; 
using System.Runtime.InteropServices; 
namespace InteropDemo 
{ 
    class MainClass 
    { 
      [DllImport("countbyone")] 
      private static extern int SomeMethod(int num); 

     public static void Main (string[] args) 
     { 
      var x = SomeMethod(0); 
      Console.WriteLine(x); 
     } 
    } 
} 

mcs interop.cs

моно interop.exe

Должен ли должно быть 1 и никаких ошибок ...

+0

здорово! это было очень полезно! – inside