我正在通过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