2016-05-26 2 views
1

Имеет проблемы с созданием библиотеки привязки для Xamarin.iOS. В основном мне нужно построить его для ссылки на dll в отдельный проект.Xamarin - ошибка создания библиотеки привязки Messaging.g.cs

Здесь мой пример project.

Этот вопрос автогенерируемая Messaging.g.cs появляется ошибки и заканчивается в середине строки:

// 
// 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 

Я также следовал за официальным walktrough от Xamarin.

Оригинальное репо для проекта, который я пытаюсь построить, это here, который является обязательным проектом для оригинала Objectice-C here.

Я не могу понять, почему Messaging.g.cs ошибки и предотвращает сборку.

Любая помощь будет оценена по достоинству.

Все самое лучшее,

Джон

ответ

0

мне удалось решить эту проблему.

Надеюсь, этот ответ поможет другим разработчикам Xamarin в будущем.

Если вы используете библиотеку связывания Objective C, вы должны построить с XCode и сгенерировать ApiDefinition.cs и StructsAndEnums.cs, используя Objective Sharpie, доступный here.

Проблема, с которой я столкнулся, была автоматически сгенерированным кодом, который не обрабатывает Delegates должным образом. Кроме того, атрибут [Native] заставил интерпретатора использовать несовместимые типы данных - т. Е. И enum struct с uint.

Усугубляя проблемы выше, я также пытался связать несколько статических библиотек в одном проекте.

Так, некоторые вещи, которые нужно будет реорганизовать в пределах вашей цели Шарпи генерироваться 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); 

Далее найти пример, когда инструмент сгенерировал ванной um struct, которая наследуется от неподдерживаемого примитива.

Так, например:

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

Изменения public enum FrontViewPosition : ulong.

Дальше удалять любые [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 в любом желаемом проекте, чтобы использовать его.

Если кто-то ищет библиотеку SWRevealViewController в Xamarin, то для экономии времени вы можете использовать мой репо here.

Удачи и получайте удовольствие.

John

Смежные вопросы