【问题标题】:Xamarin.iOS C# interoperability with objective-c: callbacks from objective-c to non-static C# methodsXamarin.iOS C# 与 Objective-c 的互操作性:从 Objective-c 到非静态 C# 方法的回调
【发布时间】:2020-03-05 23:18:23
【问题描述】:

我是 Objective-c 新手,所以请原谅可能不正确的术语。

在 Xamarin.iOS 中,我成功地使用了具有多个静态方法的 C# 类来实现从 Objective-C 到 C# 的回调功能。我想避免创建绑定库(不想使用 Sharpie 和相关工具/步骤)。我正在寻找一种让 Objective-c 回调到 C# 中的非静态方法的方法。 Objective-c 是否可以回调非静态 Xamarin.iOS C# 方法?我的 Objective-c 到 C# 回调技术如下,并在下面进一步描述:

  • 在 C# 中创建一个包含我的静态回调方法的类。这个类继承自 NSObject。
  • 在objective-c 中创建一个与C# 中定义的“回调”类匹配的@protocol。
  • 在 C# 中实例化“回调”类并获取其 NSObject.Class.Handle
  • 将“回调”类实例的 NSObject.Class.Handle 从 C# 传递给 Objective-c,
  • 在objective-c 中,将句柄转换为一个id(对于先前定义的@protocol),并使用这个id 作为C# 类实例的委托(现在在objective-c 中显示为@interface 实例)。

使用这种技术,我可以将我的 C#“回调”类实例视为objective-c 中的@interface 实例。在 Objective-c 中,我可以通过将 C# 类实例中的方法视为@interface 实例方法来调用它们。

在 C# 中

  • 定义一个继承自 NSObject 的类(NSObject 包括 Class.Handle 定义)
  • [注册]类并[导出]类中的静态回调
  • 使用“NSObject.Class.Handle”获取 IntPtr 类句柄
  • 将类实例句柄 (IntPtr) 编组到 Objective-c 作为“UnmanagedType.IUnknown”

在objective-c中

  • 定义一个与 C# 类对应的“@protocol”。 @protocol 具有对应于 C# 类中每个静态回调方法的实例方法
  • 将 IntPtr(来自 C#)转换为“@protocol”的“id”
  • 将 id 用作 C# 类实例的委托(其行为类似于objective-c @interface 实例)

使用这种技术,我可以将 C# 类句柄用作objective-c 中的协议ID,并将C# 类作为objective-c 中的@interface 引用。

是否可以使用这个相同(或相似)的方法(将类句柄从 C# 传递给 Objective-c 并使用该类句柄作为委托)从 Objective-c 调用非静态 C# 方法?

    // C# "call-back" class
    [Register("AppDelegate")]
    public class AppDelegate : NSObject
    {
        [Export("OnLoginSucceeded:")]
        public static void OnLoginSucceeded(string sessionToken)
        {
            // Do stuff
        }

        [Export("OnRequestFailed")]
        public static void OnRequestFailed()
        {
            // Do stuff
        }

        [Export("OnConnectionFailed")]
        public static void OnConnectionFailed()
        {
            // Do stuff
        }

        public IntPtr GetInstancePointer()
        {
            IntPtr self = Class.Handle;
            return self;
        }
    }


    // objective-c protocol for C# "call-back" class
    #import <Foundation/Foundation.h>

   @protocol AppDelegate <NSObject>
    - (void)OnLoginSucceeded : (NSString*)sessionToken;
    - (void)OnRequestFailed;
    - (void)OnConnectionFailed;

    @end


    // objective-c calls to C# callback
    [self.appDelegate OnLoginSucceeded : response.sessionToken];
    [self.appDelegate OnRequestFailed];
    [self.appDelegate OnConnectionFailed];

【问题讨论】:

  • 如果回答对您有帮助,请记得稍后有时间标记ot投票。提前谢谢*.^
  • 您的文章内容丰富。谢谢你。我还没准备好将它标记为我的问题的“答案”,但它包含的信息比我在其他任何地方找到的有关 C#/objective-c 绑定的信息都要多。

标签: objective-c callback xamarin.ios language-interoperability


【解决方案1】:

objective-c 是否可以回调非静态 Xamarin.iOS C# 方法?

不太了解非静态,不过我知道binding custom controls的时候,绑定属性一定是静态的

  • 绑定属性必须是静态的 - 定义属性绑定时,必须使用[Static] 属性。

【讨论】:

  • 您提供的链接在 C# 中定义了一个接口,然后声明 [Static] 是必需的“因为合同是接口的一部分,并且接口没有静态与实例声明的概念......”我的技术在 C# 中使用了一个类定义(从 NSObject 派生),它与 Objective-C 中的 @protocol 定义配对。我没有在任何地方找到我的技术记录,这就是我问我的问题的原因。
  • @Tony Okey,明白了。如果您的技术的优点稍后会在这里分享。
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2011-05-26
相关资源
最近更新 更多