0

我有一个Xamarin iOS绑定库中的重复构造函数,其代码由第三方SDK代码中的sharpie工具生成。基本上C#生成的接口是使用NSFileHandle作为基本类型,SDK头文件在其子类中声明了与NSFileHandler中相同的指定初始化程序,所以我得到“Member ... is already defined error”,因为现在绑定库正在生成两次C#构造函数 - 第一次来自基类,第二次来自子类初始化器。Xamarin iOS绑定库重复的构造函数问题

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) 
    { 
     //... 
    } 
    //... 
} 

我怎样才能防止绑定库两次生成构造函数从而摆脱错误?

+2

只需从'ApiDefinitions.cs'中删除一个,以便在自动生成的'.g.cs'中只能得到一个'CompilerGenerated'版本。 – SushiHangover

+0

这似乎是sharpie和绑定库代码生成器之间的不匹配。因此,发生器应该首先查看代码,并且在子类中已经存在一个时,省略基类的构造器创建,否则sharpie不应该为指定的初始化器生成构造器。 – awattar

回答

0

看起来,您可以简单地从ApiDefinitions.cs中删除重复的构造函数,如@SushiHangover建议的那样。