在Xamarin.Mac中注册服务



我正在通过Xamarin.Mac在OS X中注册一个上下文服务。到目前为止,我已经注册了该服务,编写了它,导出了它的签名,并在Finder中显示了该项。但是,无论何时调用上下文项,都不会发生任何事情。到目前为止,我有以下内容;

在应用程序中代表:

NSApplication.SharedApplication.ServicesProvider = _servicesProvider;
NSUpdateDynamicServices (); //using DllImport(Constants.AppKitLibrary) on an extern method 

然后,我在注册到我的服务的NSObject上有以下方法签名,应该调用它:

[Export("testService:userData:error:")]
public void TestService(NSPasteboard pboard, NSString userData, NSString error)
{
    TestAction ();
}

苹果文档规定,签名的形式应该是messageName:userData:error:,我相信我已经有了,但是,它在所需的签名中也引用了一个双NSString指针,即:

- (void)simpleEncrypt:(NSPasteboard *)pboard userData:(NSString *)userData error:(NSString **)error

这让我觉得这个方法不匹配。

有什么建议吗?

更新

我把头伸进系统日志,发现了这个;

Cannot find service provider for selector testService:userData:error: or testService:: for service testService

它告诉我该方法没有正确导出。这里的另一位用户似乎也有类似的困惑。

更新2

为了确保我的选择器工作正常,我添加了一个直接的消息调用;

Messaging.void_objc_msgSend_IntPtr_IntPtr_IntPtr (_serviceProvider.Handle, _selector.Handle, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);

它执行的操作非常好(我使用IntPtr.Zero,因为签名中需要变量,但在我的测试用例中没有使用),再加上我最初问题中的选择器消息,表明ServicesProvider赋值中有些地方不正常。

我已经为此奋斗了一段时间。方法签名是问题所在。错误参数是双指针。c#中的正确方法是:

[Export("testService:userData:error:")]
public void TestService(NSPasteboard pboard, NSString userData, ref IntPtr error)

它现在在我的项目中没有问题。

在以下位置找到双指针的解决方案:https://forums.xamarin.com/discussion/56064/binding-project-nsmutablearray-pointer

最新更新