您是正确的,您不能简单地将框架添加到 XCode 项目中,因为它是由 MonoDevelop 生成的——从这个意义上说,它不是一个“真正的”项目。
你有几个选择:
1 - 用 C# 编写自己的实现
2 - 选择一个开源实现(例如 Chromium Tabs)并将其移植到 C#。这应该可行,但显然会很耗时。此外,您可能会发现您需要访问 MonoMac 中尚不存在的一些 Cocoa API - 您需要找出解决方法或实现它们。
3 - 可以将本机框架绑定到您的应用程序中。也许您可以找到已经为您感兴趣的框架完成此操作的人;或者你可以自己做。
我自己已经在#3 上苦苦挣扎了一两天,但终于弄明白了,所以我会和你分享这个过程,也许这会有所帮助。
我下载了铬标签源并编译了框架。您只需要将其编译为 i386;因为 MonoMac 目前只提供 32 位运行时
我将 ChromiumTabs.framework 添加到我的项目中,并设置了一个预构建脚本以将其复制到 ${TargetDir}/${ProjectName}.app/Contents/Frameworks/
在调用 NSApplication.Init() 之前,我在 Main 中手动加载框架:
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,您可以在项目中引用该 DLL。
您现在应该可以使用新的绑定了!
我在库上做了一个非常小的绑定,足以让它启动并运行。你可以在这里下载。