2016-05-26 20 views
1

Xamarin.iOS用のバインディングライブラリを構築する際に問題が発生しました。基本的には、dllを別のプロジェクトに参照するためにビルドする必要があります。Xamarin - バインディングライブラリの構築中にエラーが発生しました。Messaging.g.cs

ここに私の例project

// 
// Auto-generated from generator.cs, do not edit 
// 
// We keep references to objects, so warning 414 is expected 

#pragma warning disable 414 

using System; 
using System.Drawing; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 
using System.Runtime.CompilerServices; 
using UIKit; 
using GLKit; 
using Metal; 
using MapKit; 
using ModelIO; 
using Security; 
using SceneKit; 
using CoreVideo; 
using CoreMedia; 
using QuickLook; 
using Foundation; 
using CoreMotion; 
using ObjCRuntime; 
using AddressBook; 
using CoreGraphics; 
using CoreLocation; 
using AVFoundation; 
using NewsstandKit; 
using CoreAnimation; 
using CoreFoundation; 

namespace ApiDefinition { 
    partial class Messaging { 
     static internal System.Reflection.Assembly this_assembly = typeof (Messaging).Assembly; 

     const string LIBOBJC_DYLIB = "/usr/lib/libobjc.dylib"; 

     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static IntPtr IntPtr_objc_msgSend (IntPtr receiever, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static IntPtr IntPtr_objc_msgSendSuper (IntPtr receiever, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static IntPtr IntPtr_objc_msgSend_IntPtr (IntPtr receiever, IntPtr selector, IntPtr arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static IntPtr IntPtr_objc_msgSendSuper_IntPtr (IntPtr receiever, IntPtr selector, IntPtr arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static void void_objc_msgSend_IntPtr (IntPtr receiver, IntPtr selector, IntPtr arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static void void_objc_msgSendSuper_IntPtr (IntPtr receiver, IntPtr selector, IntPtr arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static int int_objc_msgSend (IntPtr receiver, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static int int_objc_msgSendSuper (IntPtr receiver, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static void void_objc_msgSend_int (IntPtr receiver, IntPtr selector, int arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static void void_objc_msgSendSuper_int (IntPtr receiver, IntPtr selector, int arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static float float_objc_msgSend (IntPtr receiver, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static float float_objc_msgSendSuper (IntPtr receiver, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static void void_objc_msgSend_float (IntPtr receiver, IntPtr selector, float arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static void void_objc_msgSendSuper_float (IntPtr receiver, IntPtr selector, float arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static bool bool_objc_msgSend (IntPtr receiver, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static bool bool_objc_msgSendSuper (IntPtr receiver, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static void void_objc_msgSend_bool (IntPtr receiver, IntPtr selector, bool arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static void void_objc_msgSendSuper_bool (IntPtr receiver, IntPtr selector, bool arg1); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static global::System.Double Double_objc_msgSend (IntPtr receiver, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSendSuper")] 
     public extern static global::System.Double Double_objc_msgSendSuper (IntPtr receiver, IntPtr selector); 
     [DllImport (LIBOBJC_DYLIB, EntryPoint="objc_msgSend")] 
     public extern static void vo 

は私もXamarinから公式walktroughをたどっ:

問題がMessaging.g.cs自動生成がエラーに表示され、ミッドラインを終了です。

ビルドしようとしているプロジェクトの元のレポは、元のObjectice-C hereのバインディングプロジェクトであるhereです。

なぜMessaging.g.csエラーが発生し、ビルドが完了しないのか分かりません。

ご協力いただければ幸いです。

すべてのベスト、

私は問題を解決するために管理しているジョン・

答えて

0

今後この回答が他のXamarin開発者に役立つことを願っています。

Objective Cバインディングライブラリを使用している場合は、Xcodeを使用してビルドし、Objective Sharpieが利用可能なhereを使用してApiDefinition.csとStructsAndEnums.csを生成する必要があります。

私が発生した問題は、自動生成コードがDelegatesを適切に処理しないという問題でした。さらに、[Native]属性により、インタープリタは互換性のないデータ型(enum構造体、uint)を使用しました。

私は同じ問題を2つ以上同じプロジェクト内の.a静的ライブラリにバインドしようとしていました。

だから、あなたはあなたの目的シャーピー以内にリファクタリングする必要がありますいくつかのものは、C#ファイルを生成:へのに対し

 // @optional -(BOOL)revealControllerPanGestureShouldBegin:(SWRevealViewController *)revealController; 
     [Export("revealControllerPanGestureShouldBegin:")] 
     bool RevealController(SWRevealViewController revealController); 

     // @optional -(BOOL)revealControllerTapGestureShouldBegin:(SWRevealViewController *)revealController; 
     [Export("revealControllerTapGestureShouldBegin:")] 
     bool RevealController(SWRevealViewController revealController); 

は私の例では、ツールが次のコードを生成したメソッドのシグネチャのいずれかの重複を削除しますコンパイラが重複したメソッドエラーを投げるのを避けてください:

 // @optional -(BOOL)revealControllerPanGestureShouldBegin:(SWRevealViewController *)revealController; 
     [Export("revealControllerPanGestureShouldBegin:")] 
     bool RevealControllerPanGestureShouldBegin(SWRevealViewController revealController); 

     // @optional -(BOOL)revealControllerTapGestureShouldBegin:(SWRevealViewController *)revealController; 
     [Export("revealControllerTapGestureShouldBegin:")] 
     bool RevealControllerTapGestureShouldBegin(SWRevealViewController revealController); 

次に、ツールでen umサポートされていないプリミティブから継承するstruct。

したがって、たとえば:public enum FrontViewPosition : ulong

[Native] 
public enum FrontViewPosition : uint 
{ 
    LeftSideMostRemoved, 
    LeftSideMost, 
    LeftSide, 
    Left, 
    Right, 
    RightMost, 
    RightMostRemoved 
} 

変更。

次は、[Verify]の装飾を削除します。

最後に、私は客観シャーピーは、拡張メソッドを不完全に処理し、生成されたコードの結果は、たとえば、

を修正するには...内の仮想メソッドを持つ静的クラスを作成[Category]のすべてのインスタンスを検索しようとしていることが見つかりました:

// @interface SWRevealViewController (UIViewController) 
[Category] 
[BaseType(typeof(UIViewController))] 
partial interface UIViewController_SWRevealViewController 
{ 
    // -(SWRevealViewController *)revealViewController; 
    [Export("revealViewController")] 
    SWRevealViewController RevealViewController{ get; }; 
} 

そして

// @interface SWRevealViewController (UIViewController) 
[Category] 
[BaseType(typeof(UIViewController))] 
partial interface UIViewController_SWRevealViewController 
{ 
    // -(SWRevealViewController *)revealViewController; 
    [Export("revealViewController")] 
    SWRevealViewController RevealViewController(); 
} 

今きれいにそれを変更して再構築し、自動生成されたコード意志今コム正しく積み重ねる。任意のプロジェクトでバインディングdllを参照して、それを利用してください。

XamarinでSWRevealViewControllerライブラリを使用している人は、私のrepo hereを使用すると時間を節約できます。

幸運と楽しみを持っています。

ジョン

関連する問題