检查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内部。

感谢

检查P/Invoke是否成功

如果找不到共享(本机)库,您将收到:

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并且没有错误。。。