【问题标题】:Xamarin iOS binding library duplicated constructors issueXamarin iOS 绑定库重复构造函数问题
【发布时间】:2017-07-26 20:48:32
【问题描述】:

我遇到了 Xamarin iOS 绑定库中重复构造函数的问题,其中代码由第三方 SDK 代码中的 Sharpie 工具生成。基本上 C# 生成的接口使用 NSFileHandle 作为基本类型,并且 SDK 头文件在其子类中声明相同的指定初始化程序,就像在 NSFileHandler 中一样,所以我得到“成员......已经定义错误”,因为现在绑定库正在生成 C# 构造函数两次 -第一次来自基类,第二次来自子类初始化程序。

Objective-C 代码:

@interface MyFileHandle : NSFileHandle
//...
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
//...

C#绑定库代码:

[BaseType(typeof(NSFileHandle))]
public interface MyFileHandle
{
    //...
    [Export("initWithCoder:")]
    [DesignatedInitializer]
    IntPtr Constructor(NSCoder coder);
    //...
}

绑定库生成代码(*.g.cs):

[Register("MyFileHandle", true)]
public unsafe partial class MyFileHandle : NSFileHandle {
    //...
    [CompilerGenerated]
    [DesignatedInitializer]
    [EditorBrowsable (EditorBrowsableState.Advanced)]
    [Export ("initWithCoder:")]
    public MyFileHandle (NSCoder coder) : base (NSObjectFlag.Empty)
    {
        //...
    }

    [Export ("initWithCoder:")]
    [DesignatedInitializer]
    [CompilerGenerated]
    public MyFileHandle (NSCoder coder)
        : base (NSObjectFlag.Empty)
    {
       //...
    }
    //...
}

如何防止绑定库生成两次构造函数从而消除错误?

【问题讨论】:

  • 只需从ApiDefinitions.cs 中删除一个,这样您就只会在自动生成的.g.cs 中获得一个CompilerGenerated 版本。
  • 这似乎是 Sharpie 和绑定库代码生成器之间的不匹配。所以生成器应该首先查看代码,当子类中已经有基类时省略构造函数的创建,或者Sharpie不应该为指定的初始化器生成构造函数。

标签: xamarin xamarin.ios native objective-sharpie xamarin-binding


【解决方案1】:

您似乎可以按照@SushiHangover 的建议从 ApiDefinitions.cs 中删除重复的构造函数。

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多