Вы правы в том, что вы не можете просто добавить фреймворк в проект XCode, потому что он сгенерирован MonoDevelop - в этом смысле это не «настоящий» проект.
У вас есть несколько вариантов:
1 - Напишите собственную реализацию на С#
2. Выберите реализацию с открытым исходным кодом (например, вкладки Chromium) и перенесите ее на 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 из фреймворка. Используйте сгенерированный вывод для создания интерфейсов, которые будут определять вашу привязку (есть хорошая документация по типам привязки здесь). Например:
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, на которую вы можете ссылаться в своем проекте.
Теперь вы сможете использовать новую привязку!
Я сделал очень минимальную привязку к библиотеке, достаточно, чтобы она заработала. Вы можете скачать это здесь.
person
TheNextman
schedule
26.02.2013