在Xamarin.Mac中注册服务

问题描述 投票:4回答:1

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

在ApplicationDelegate中:

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 ();
}

[Apple Documentation声明签名应该采用我相信的格式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

对我来说,该方法未正确导出。似乎另一个用户here有类似的难题。

更新2

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

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

哪个执行的动作非常好(我使用了IntPtr.Zero,因为变量是签名中必需的,但在我的测试用例中没有使用),它与我最初的问题中的选择器消息结合在一起,表明某些操作不正确ServicesProvider分配。

c# objective-c mono xamarin xamarin.mac
1个回答
0
投票

我已经为此努力了一段时间。方法签名是问题所在。错误参数是双指针。 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

© www.soinside.com 2019 - 2024. All rights reserved.