我正在尝试使用Ubuntu 14.04在Mono上使用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
。
由于
答案 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
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而且没有错误......