我想綁定一些本地代碼在MonoMac/Xamarin.Mac中使用,但我不知道我要去哪裏錯了。我創建了一個簡單的dylib來進行測試:MonoMac/Xamarin.Mac綁定簡單的dylib不工作
nativelibrary.h:
- (NSString *)echo:(NSString *)message;
我知道,我的圖書館是好的,因爲我引用,而且在一個Objective-C/Cocoa應用程序中使用它。
接下來,我嘗試使用parse.exe生成初始綁定文件:
mono parse.exe [path...]/nativelibrary.h
問題#1 否 'gen.cs' 文件作爲每個Miguel的guide
產生問題#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
This spits out a在我的MonoMac項目中引用的.dll。
最後,我將.dylib本身添加到我的MonoMac項目中,並指定'內容'構建操作。我確認.dylib被複制到我的包的'Resources'目錄中。
我可以實例我的綁定對象的實例沒有問題:
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
我看過另一個question,我們需要強制加載.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'
我在做什麼錯?