代码之家  ›  专栏  ›  技术社区  ›  o-o-awake-o-o

Xamarin-构建绑定库Messaging.g.cs时出错

  •  3
  • o-o-awake-o-o  · 技术社区  · 9 年前

    为Xamarin.iOS构建绑定库时遇到问题。基本上,我需要构建它来引用 dll 到一个单独的项目中。

    这里是我的例子 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
    

    我还从 Xamarin .

    我尝试构建的项目的原始回购是 here 这是原始Objectice-C的绑定项目 here .

    我不知道为什么 信息.g.cs 错误并阻止生成完成。

    任何帮助都将不胜感激。

    一切顺利,

    约翰

    1 回复  |  直到 9 年前
        1
  •  4
  •   o-o-awake-o-o    9 年前

    我已经设法解决了这个问题。

    我希望这个答案对其他Xamarin开发人员有帮助。

    如果您使用的是Objective C绑定库,则应使用XCode构建并生成ApiDefinition。cs和StructsAndEnum。cs使用 Objective Sharpie 可获得的 here .

    我遇到的问题是自动生成的代码无法处理 Delegates 正确地此外 [Native] 属性导致解释器使用不兼容的数据类型,即和 enum 结构与 uint .

    使上述问题更加复杂的是,我还试图绑定多个 .a 同一项目中的静态库。

    因此,您需要在Objective Sharpie生成的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);
    

    接下来,查找工具生成了从不受支持的原语继承的枚举结构的任何示例。

    因此,例如:

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

    对的更改 public enum FrontViewPosition : ulong .

    接下来删除任何 [Verify] 装饰。

    最后,我发现Objective Sharpie处理扩展方法的能力很差,导致生成的代码试图创建一个包含虚拟方法的静态类。。。

    要修复,请查找的所有实例 [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中的库,这样可以节省您使用我的repo的时间 here .

    祝你好运,玩得开心。

    约翰