/ / Sprawdź, czy P / Invoke się powiodło - c #, .net, mono, pinvoke, asenizacja

Sprawdź, czy P / Invoke się powiodło - c #, .net, mono, pinvoke, asenizacja

Próbuję użyć metody P / Invoke na Mono przy użyciu Ubuntu 14.04:

Część C ++:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

EXTERN_DLL_EXPORT int SomeMethod(int num);

// and .cpp file with the actual implementation

Część C #:

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

Console.WriteLine(SomeMethod(2));

Jednak jeśli spróbuję wywołać metodę, zawsze otrzymuję NullReferenceException, Zastanawiam się, w jaki sposób można sprawdzić, czy wyjątek został podniesiony, ponieważ P / Invoke nie powiodło się, może dlatego, że nie był w stanie prawidłowo załadować metodę lub referencja zerowa rzeczywiście wystąpił w środku SomeMethod.

Dzięki

Odpowiedzi:

1 dla odpowiedzi № 1

Jeśli biblioteka współdzielona (natywna) nie zostanie znaleziona, otrzymasz:

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

Jeśli masz niedopasowanie punktu wejścia, otrzymasz:

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

Jeśli biblioteka współdzielona uległa awarii, nigdy nie otrzymasz ramki o wartości null ref.

Tak więc.więc jest ładowany i wywoływana jest funkcja "c", ale coś w strukturze mono rzuca dopasowanie. Marshaling interop to pierwsze miejsce, na które patrzę, istnieje pewne niedopasowanie między tym, co przechodzisz z C # do Cpp lub z powrotem ... Jeśli przykładowy, który podasz, jest prawdziwy, po prostu "int", a nie wskaźniki / structs / etc .. to powinno po prostu działać.

Najprostszy przypadek Interop HelloWorld, który mogę utworzyć, nadać mu wartość true i zobaczyć, co się stanie:

cat countbyone.cpp

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

  • lub OS-X:
  • clang -dynamiclib countbyone.cpp -o libcoutbyone.dylib

cat 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

mono interop.exe

Powinien być 1 i bez błędów ...