的MonoMac / Xamarin.Mac结合简单dylib不工作(MonoMac / Xamar

2019-10-17 18:06发布

我想绑定在的MonoMac / Xamarin.Mac使用一些本地代码,但我不知道我要去哪里错了。 我创建了一个简单的dylib来进行测试:

nativelibrary.h:

- (NSString *)echo:(NSString *)message;

我知道,我的图书馆是好的,因为我引用,而且在一个Objective-C / Cocoa应用程序中使用它。

接下来,我尝试使用parse.exe生成初始绑定文件:

mono parse.exe [path...]/nativelibrary.h 

问题1号“gen.cs”文件按米格尔的产生指南

问题2 Parse.exe并不实际输出的东西到控制台,虽然它缺少我唯一的方法是什么?

[BaseType (typeof (NSObject))]
interface nativelibrary {
}

无论如何,我继续前进,让我自己gen.cs文件,手动缺少方法填充:

gen.cs:

using MonoMac.Foundation;

namespace ManagedConsumer
{
    [BaseType (typeof (NSObject))]
    interface Binding 
    {
        [Export ("echo:")]
        string Echo(string message);

        // I also tried like this:
        // NSString Echo(NSString message);
    }
}

接下来,我尝试使用bmac.exe创建我结合DLL:

mono bmac.exe -o="dynamiclibrary.dll" -d="MONOMAC" -r="System.Drawing" -v [path].../gen.cs 

该吐出来,我在我的项目的MonoMac引用一个.dll。

最后,我的名为.dylib自身添加到我的项目的MonoMac,并指定“内容”建设行动。 我验证名为.dylib被复制到我的包的“资源”目录。

我可以实例我的绑定对象没有问题的一个实例:

Binding b = new Binding();
Console.WriteLine(b.ToString());

问题3然而,试图调用我的方法:

Binding b = new Binding();
var result = b.Echo((NSString)"Hello, world");

导致非托管的崩溃:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000000bf74bffc

我已经看到了另一个问题 ,我们需要强制名为.dylib加载。 所以我尝试插入该行到我main.cs,Application.Init()被调用:

Dlfcn.dlopen ("nativelibrary.dylib", 0);

但我得到同样的崩溃。 由于调用dlopen的返回0,而不是一个有效的指针,我认为这个问题是在我的加载动态链接库。 我也试着使用属性:

[assembly:MonoMac.RequiredFramework("nativelibrary.dylib")]

但是,这只是让我:

System.Exception: Unable to load required framework: 'nativelibrary.dylib'

我究竟做错了什么?

Answer 1:

大量的试验和错误之后,我能够完成这项工作。 两个变化:

在我的自制gen.cs文件,接口名称必须符合我的原生类,即名

nativelibrary.h

@interface nativelibrary : NSObject

- (NSString *)echo:(NSString *)message;

gen.cs

使用MonoMac.Foundation;

namespace ManagedConsumer
{
    [BaseType (typeof (NSObject))]
    interface nativelibrary 
    {
        [Export ("echo:")]
        string Echo(string message);
    }
}

其次,似乎有一些关于我的本地库本身,这意味着它不能使用dlopen打开。 我认为问题是,Xcode的“图书馆”项目默认为64位,它似乎仅适用于x86会工作。

我在命令行编译它,而不是像这样:

gcc -arch i386 -framework Cocoa -o nativelibrary.o  -c [path...]/nativelibrary.m 

然后建立了我的图书馆:

libtool -dynamic -flat_namespace -lSystem -undefined suppress -macosx_version_min 10.6 -install_name $CURRENT_DIR/nativelibrary.dylib -o nativelibrary.dylib nativelibrary.o 

而现在它工作。



文章来源: MonoMac / Xamarin.Mac binding simple dylib not working