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 

Problem #1 No 'gen.cs' file is generated as per Miguel's guide

Problem #2 Parse.exe does actually output something to the console, although it's missing my only method?

[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);
    }
}

Затем я пытаюсь создать свою связывающую DLL, используя bmac.exe:

mono bmac.exe -o="dynamiclibrary.dll" -d="MONOMAC" -r="System.Drawing" -v [path].../gen.cs 

Это выплевывает .dll, который я упоминаю в моем проекте MonoMac.

Наконец, я добавляю сам .dylib к моему проекту MonoMac и указываю действие сборки. Я проверяю, что .dylib копируется в каталог «Ресурсы» моего пакета.

Я могу создать экземпляр экземпляра объекта привязки без проблем:

Binding b = new Binding();
Console.WriteLine(b.ToString());

Problem 3 However, trying to call my method:

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'

Что я делаю не так?

1
nl ja de

1 ответы

После много проб и ошибок, я смог выполнить эту работу. Два изменения:

В моем файле homebrew 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 

И теперь это работает.

5
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Xamarin Developers
Xamarin Developers
1 050 участник(ов)

Чат разработчиков приложений на Xamarin для iOS, Android и Windows 10!

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot