检查P / Invoke是否成功

时间:2015-06-23 20:43:38

标签: c# .net mono pinvoke marshalling

我正在尝试使用Ubuntu 14.04在M​​ono上使用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引用实际上发生在SomeMethod

由于

1 个答案:

答案 0 :(得分:1)

如果找不到共享(本机)库,则会收到:

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

如果您的入口点不匹配,您会收到:

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

如果共享库崩溃,你将永远不会得到框架null ref。

因此,正在加载.so并且正在调用'c'函数,但是单声道框架中的某些内容正在被调整。 Marshaling interop是我看的第一个地方。你从C#传递到Cpp或者返回的东西之间存在一些不匹配...如果你给出的样本是真的,只是'int',而不是指针/结构/等等。那么它应该可以工作。

我可以创建的最简单的Interop案例HelloWorld,给它一个真实的,看看会发生什么:

  

cat countbyone.cpp

extern "C" int SomeMethod(int num) {
  return num++;
}
  •   

    gcc -g -shared -fPIC countbyone.cpp -o libcountbyone.so

  • 或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

应该是1而且没有错误......