我想绑定在的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'
我究竟做错了什么?