2013-02-25 73 views
1

我想綁定一些本地代碼在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' 

我在做什麼錯?

回答

5

經過很多的試驗和錯誤,我能夠做到這一點。兩個變化:

在我的自制gen.cs文件,以配合我的原生類的名稱所需要的接口名稱,即

nativelibrary.h

@interface nativelibrary : NSObject 

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

根。 cs

using MonoMac.Foundation;

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

其次,似乎有一些關於我的本地庫本身,這意味着它無法的dlopen打開。我認爲問題在於XCode'library'項目默認爲x64,並且只有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 

現在它的工作原理。