检查P/Invoke是否成功
本文关键字:是否 成功 Invoke 检查 | 更新日期: 2023-09-27 17:59:30
我正试图使用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失败而引发的,可能是因为它无法正确加载该方法,或者空引用实际上发生在SomeMethod
内部。
感谢
如果找不到共享(本机)库,您将收到:
XXXXX failed to initialize, the exception is: System.DllNotFoundException
如果您的入口点不匹配,您将收到一个:
XXXXX failed to initialize, the exception is: System.EntryPointNotFoundException
如果共享库崩溃,你永远不会得到框架空引用
因此,.So正在被加载,'c'函数正在被调用,但mono框架中的某些东西正在引发问题。整理互操作是我首先要考虑的地方。您从C#传递到Cpp或返回的内容之间存在一些不匹配。。。如果您给出的示例为true,则仅为"int",而不是指针/structs/等。。那么它应该会起作用。
HelloWorld是我能创建的最简单的Interop案例,给它一个真实的结果,看看会发生什么:
cat countbyone.cpp
extern "C" int SomeMethod(int num) {
return num++;
}
gcc-g共享-fPIC countbyone.cpp-o libcountbyone.so
- 或OS-X:
clang-dynamiclib countbyone.cpp-o libcoutbone.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
单声道互操作
应该是1并且没有错误。。。