1

MonoMac / Xamarin.Mac で使用するネイティブ コードをバインドしようとしていますが、どこが間違っているのかわかりません。テストする単純な dylib を作成します。

nativelibrary.h :

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

ライブラリを参照して Objective-C / Cocoa アプリケーションで使用しているため、ライブラリが問題ないことはわかっています。

次に、parse.exe を使用して初期バインディング ファイルの生成を試みます。

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

問題 #1 Miguel のガイド に従って「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 プロジェクトに追加し、'content' ビルド アクションを指定します。.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

別の質問で、.dylib を強制的にロードする必要があることを確認しました。したがって、 Application.Init()が呼び出される前に、この行をmain.csに挿入しようとします。

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

しかし、同じクラッシュが発生します。dlopenの呼び出しは有効なポインターではなく 0 を返すため、問題は動的ライブラリーのロードにあると考えられます。私も属性を使用しようとしました:

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

しかし、それは私を得るだけです:

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

私は何を間違っていますか?

4

1 に答える 1

5

試行錯誤の末、この作品を作ることができました2 つの変更:

自作の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 の「ライブラリ」プロジェクトのデフォルトが 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 

そして、それは今動作します。

于 2013-02-25T20:53:07.123 に答える