Вы правы, что вы не можете просто добавить фреймворк к проекту XCode, потому что он создан MonoDevelop - это не настоящий проект в этом смысле.
У вас есть несколько вариантов:
1 - Напишите собственную реализацию в C#
2 - Выберите реализацию с открытым исходным кодом (например, Chromium Tabs) и портирование на C#. Это должно работать, но, очевидно, потребуется много времени. Также вы можете обнаружить, что вам нужен доступ к некоторым API-интерфейсам Cocoa, которых нет в MonoMac, но вам нужно будет найти способ обхода или реализовать их.
3 - В ваше приложение можно привязать родной фреймворк. Возможно, вы можете найти кого-то, кто уже сделал это для интересующей вас структуры; или вы можете сделать это сами.
Я уже несколько дней борюсь с № 3 сам, но, наконец, все выяснилось, поэтому я поделюсь с вами процессом, и, возможно, это будет полезно.
Я загрузил источник вкладок хрома и скомпилировал фреймворк. Вам нужно будет скомпилировать его только как i386; так как MonoMac в настоящее время только отправляет 32-битную рабочую среду
Я добавил ChromiumTabs.framework в свой проект и настроил сценарий предварительной сборки, чтобы скопировать его в $ {TargetDir}/$ {ProjectName} .app/Contents/Frameworks/
загружаю рамки вручную внутри Main, перед вызовом NSApplication.Init():
var baseAppPath = Directory.GetParent(Directory.GetParent(System.AppDomain.CurrentDomain.BaseDirectory).ToString());
var chromiumPath = baseAppPath + "/Frameworks/ChromiumTabs.framework/ChromiumTabs";
var hresult = Dlfcn.dlopen(chromiumPath, 0); // Non-zero result indicates success
Далее, использование parse.exe (доступно в MonoMac при компиляции из исходных кодов) и подачи его в .h файлов из фреймворка. Используйте сгенерированный вывод для создания интерфейсов, которые будут определять вашу привязку (есть хорошая документация по типам привязки here). Например:
using System;
using System.Drawing;
using MonoMac.Foundation;
using MonoMac.AppKit;
namespace ChromiumTabs
{
[BaseType (typeof (NSWindowController))]
interface CTTabWindowController {
}
[BaseType (typeof (CTTabWindowController))]
interface CTBrowserWindowController {
[Export ("browser")]
CTBrowser Browser { get; }
[Export ("initWithBrowser:")]
IntPtr Constructor (CTBrowser browser);
}
[BaseType (typeof (NSObject))]
interface CTBrowser {
[Export ("addBlankTabInForeground:")]
CTTabContents AddBlankTabInForeground (bool foreground);
[Export ("createBlankTabBasedOn:")]
CTTabContents CreateBlankTabBasedOn (CTTabContents baseContents);
}
[BaseType (typeof (NSDocument))]
interface CTTabContents {
[Export ("initWithBaseTabContents:")]
IntPtr Constructor ([NullAllowed]CTTabContents baseContents);
[Export ("viewFrameDidChange:")]
void ViewFrameDidChange (RectangleF newFrame);
}
}
Теперь, корма, что .cs файл в bmac.exe (проверить помощь для аргументов, которые необходимо предоставить). Это выведет управляемую DLL, которую вы можете ссылаться в своем проекте.
Теперь вы должны использовать свою новую привязку!
Я сделал очень минимальную привязку к библиотеке, достаточно, чтобы ее запустить и запустить. Вы можете скачать это here.