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

3

我正在构建一个用于Xamarin.iOS的绑定库,但遇到了问题。基本上,我需要将其构建为引用dll的单独项目。

这是我的示例项目

问题在于自动生成的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的官方指南。
我正在尝试构建的项目的原始存储库在这里,这是一个绑定原始Objectice-C 这里
我无法弄清楚为什么Messaging.g.cs会出错并阻止构建完成。
任何帮助都将不胜感激。
祝一切顺利,
John
1个回答

4
我已经成功解决了这个问题。
希望我的答案能帮助其他Xamarin开发者。
如果您正在使用Objective C绑定库,您应该使用XCode构建,并使用Objective Sharpie生成ApiDefinition.cs和StructsAndEnums.cs,可在此处获得。
我遇到的问题是自动生成的代码不能正确处理委托。此外,[Native]属性导致解释器使用不兼容的数据类型——即枚举结构与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即可。
如果有人想在Xamarin中使用SWRevealViewController库,为了节省时间,可以使用我的存储库这里
祝好运,玩得开心。
约翰

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接