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'
私は何を間違っていますか?