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建議的那樣。