Xamarin - 构建绑定库时出错 Messaging.g.cs
Xamarin - error building a binding library Messaging.g.cs
在为 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的官方walktrough。
我要构建的项目的原始存储库是 here which is a binding project for the original Objectice-C here。
我无法弄清楚为什么 Messaging.g.cs
出错并阻止构建完成。
如有任何帮助,我们将不胜感激。
祝一切顺利,
约翰
我已经设法解决了这个问题。
我希望这个答案对以后的其他 Xamarin 开发人员有所帮助。
如果您正在使用 Objective C 绑定库,您应该使用 XCode 构建并使用可用的 Objective Sharpie
生成 ApiDefinition.cs 和 StructsAndEnums.cs 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 对扩展方法的处理不佳,导致生成的代码试图创建一个静态 class 内部有虚拟方法...
要修复,找到 [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
库,那么为了节省您的时间,您可以使用我的存储库 here.
祝你好运,玩得开心。
约翰
在为 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的官方walktrough。
我要构建的项目的原始存储库是 here which is a binding project for the original Objectice-C here。
我无法弄清楚为什么 Messaging.g.cs
出错并阻止构建完成。
如有任何帮助,我们将不胜感激。
祝一切顺利,
约翰
我已经设法解决了这个问题。
我希望这个答案对以后的其他 Xamarin 开发人员有所帮助。
如果您正在使用 Objective C 绑定库,您应该使用 XCode 构建并使用可用的 Objective Sharpie
生成 ApiDefinition.cs 和 StructsAndEnums.cs 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 对扩展方法的处理不佳,导致生成的代码试图创建一个静态 class 内部有虚拟方法...
要修复,找到 [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
库,那么为了节省您的时间,您可以使用我的存储库 here.
祝你好运,玩得开心。
约翰