iOS C#与objective-C的互操作性:从objective-C回调到非静态C#方法

iOS C#与objective-C的互操作性:从objective-C回调到非静态C#方法,objective-c,callback,xamarin.ios,language-interoperability,Objective C,Callback,Xamarin.ios,Language Interoperability,我是objective-c新手,所以请原谅可能不正确的术语 在Xamarin.iOS中,我成功地使用了一个带有多个静态方法的C#类来实现从objective-C到C#的回调功能。我希望避免创建绑定库(不希望使用Sharpie和相关工具/步骤)。我正在寻找objective-c回调c#中非静态方法的方法。objective-c是否可以回调到非静态的Xamarin.iOS c#方法?我的目标-c到c#回拨技术如下所示,并在下面进一步描述: 在C#中创建一个包含静态回调方法的类。此类继承自NSObj

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

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

  • 在C#中创建一个包含静态回调方法的类。此类继承自NSObject
  • 在objective-c中创建与c#中定义的“回调”类匹配的@协议
  • 在C#中实例化“callback”类并获取其NSObject.class.Handle
  • 将“回调”类实例的NSObject.Class.Handle从C#传递到objective-C
  • 在objective-c中,将句柄强制转换为id(对于先前定义的@protocol),并将此id用作c#class实例(现在在objective-c中显示为@interface实例)的委托
使用这种技术,我可以将我的C#“回调”类实例视为objective-C中的@interface实例。在objective-c中,我可以通过将c#类实例中的方法视为@interface实例方法来调用它们

用C#

  • 定义从NSObject继承的类(NSObject包括class.Handle定义)
  • [Register]类和[Export]类内的静态回调
  • 使用“NSObject.Class.Handle”获取IntPtr类句柄
  • 将类实例句柄(IntPtr)封送到objective-c作为“UnmanagedType.IUnknown”
在objective-c中

  • 定义一个与C#类对应的“@协议”。@protocol具有与C#类中的每个静态回调方法相对应的实例方法
  • 将IntPtr(从C#)转换为“@protocol”的“id”
  • 将id用作C#类实例(其行为类似于objective-C@interface实例)的委托
使用这种技术,我可以将C#类句柄用作objective-C中的协议id,并将C#类引用为objective-C中的@接口

是否可以使用相同(或类似)的方法(将类句柄从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];
/C#“回调”类
[注册(“AppDelegate”)]
公共类AppDelegate:NSObject
{
[导出(“仅登录成功:)]
公共静态void onloginsucseed(字符串sessionToken)
{
//做事
}
[导出(“OnRequestFailed”)]
公共静态void OnRequestFailed()
{
//做事
}
[导出(“OnConnectionFailed”)]
公共静态无效OnConnectionFailed()
{
//做事
}
public IntPtr GetInstancePointer()
{
IntPtr self=Class.Handle;
回归自我;
}
}
//c#“回调”类的objective-c协议
#进口
@协议AppDelegate
-(void)onloginsucseed:(NSString*)sessionToken;
-(无效)请求失败;
-(void)连接失败;
@结束
//objective-c调用c#回调
[self.appDelegate onloginsucseed:response.sessionToken];
[self.appDelegate OnRequestFailed];
[self.appDelegate OnConnectionFailed];
objective-c是否可以回调到非静态的Xamarin.iOS c#方法

没有太多的理解非静态的,但是我知道,绑定属性必须是静态的

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

如果答案有帮助,记得在有时间的时候标记ot投票。提前感谢*^你的文章内容丰富。非常感谢。我还没有准备好将其标记为我的问题的“答案”,但它包含的信息比我在其他任何地方找到的关于C#/objective-C绑定的信息都要多。您提供的链接在C#中定义了一个接口,然后声明需要[Static]“因为契约是接口的一部分,接口没有静态vs实例声明的概念……”我的技术使用了类定义(从NSObject派生)在C#中,这与objective-C中的@protocol定义相匹配。我在任何地方都没有发现我的技术文档,这就是为什么我要问我的问题。@Tony Okey,明白了。如果你技术的优点稍后会在这里分享。