Xamarin iOS Binding 项目似乎不包含库或接口定义

Posted

技术标签:

【中文标题】Xamarin iOS Binding 项目似乎不包含库或接口定义【英文标题】:Xamarin iOS Binding project doesn't seem to include the library or interface definitions 【发布时间】:2014-09-16 16:19:22 【问题描述】:

我创建了一个 ios 绑定项目,添加我的静态库,该库创建了以下 linkwith.cs 内容以及一些我需要的添加框架和链接器标志

[assembly: LinkWith ("libMyLibrary-iOS.a", LinkTarget.ArmV7 | LinkTarget.ArmV7s | LinkTarget.Simulator,Frameworks = "CoreTelephony SystemConfiguration UIKit Foundation CoreGraphics", LinkerFlags = "-ObjC -all_load -lz -lstdc++", ForceLoad = true )]

在 ApiDefinition.cs 文件中,我复制了 Objective-Sharpie 创建的内容,并添加了一些遗漏的更正和补充。还将所有枚举移至 StructsAndEnums.cs。

我也注意到了一些奇怪的事情,intelisense 不适用于某些属性,特别是 BaseType 和 Static 是红色的并且无法识别,而 StructsAndEnums.cs 文件中的枚举。第二次构建成功,如果我清理并尝试构建我在自动生成的文件中得到错误,或者如果我尝试重建我总是得到错误,第二次构建很好。

静态库文件是 12.5MB,但结果 .dll 发布版本只有 4kb,我觉得这很奇怪,而且由于它不是我创建的第一个绑定库,我知道 .a 库应该合并到 .dll 中图书馆。

检查文件的构建操作看起来是正确的。

libMyLibrary-iOS.a -> ObjcBindingNativeLibrary

ApiDefinition.cs -> ObjcBindingDefinition

StructsAndEnums.cs -> ObjcBindingCoreSource

没有修改或添加项目属性,只是 Xamarin Studio 5.3 (build 441) 的新绑定项目。

在解决方案中,我创建了一个单视图应用程序,添加了绑定项目库作为参考,但没有可见的命名空间可用于使用接口协定。

我可以采取什么措施来解决或调试问题?

[编辑]

我在重建项目时遇到的编译错误是关于我这样设置的块

public delegate string SPLJSONModelKeyMapBlock (string keyName);

并在这个界面中使用

    [BaseType (typeof (NSObject))]
    public partial interface SPLJSONKeyMapper 

        [Export ("JSONToModelKeyBlock")]
        SPLJSONModelKeyMapBlock JSONToModelKeyBlock  get; 

        [Export ("modelToJSONKeyBlock")]
        SPLJSONModelKeyMapBlock ModelToJSONKeyBlock  get; 

        [Export ("initWithJSONToModelBlock:modelToJSONBlock:")]
        IntPtr Constructor (SPLJSONModelKeyMapBlock toModel, SPLJSONModelKeyMapBlock toJSON);

        [Export ("initWithDictionary:")]
        IntPtr Constructor (NSDictionary map);

        [Static, Export ("mapperFromUnderscoreCaseToCamelCase")]
        SPLJSONKeyMapper MapperFromUnderscoreCaseToCamelCase  get; 

        [Static, Export ("mapperFromUpperCaseToLowerCase")]
        SPLJSONKeyMapper MapperFromUpperCaseToLowerCase  get; 
    

Trampolines.g.cs中的错误截图

【问题讨论】:

【参考方案1】:

更新

尝试从委托返回 NSString 而不是字符串:

public delegate NSString SPLJSONModelKeyMapBlock (string keyName);

第一个答案

看起来第二次重建没有正确完成(如果第一次失败,第二次应该失败)。

换句话说,您需要修复(或向我们报告)您在自动生成的文件中遇到的构建错误。

【讨论】:

感谢您的回答,用所有适当的信息编辑了问题。 是的!它工作得很好,嗯,我应该检查何时将 iOS 类型用于 C# 类型。我可能会错过或从未见过的任何链接? 这是我们这边的一个bug,我们应该自动做NSString -> 字符串翻译。 太好了,感谢 Rolf 的更新。我们能否监控某处报告的问题或修复的 ETA,例如下一个 Xamarin iOS 版本? 大家好!我看到答案被标记为解决方案,但实际上我看不到“为什么图书馆是空的”问题的答案。我遇到了类似的问题:一切都可以很好地编译(构建),但是输出库只有 1KB,并且在 iOS 项目中没有可见的命名空间。有什么帮助吗?

以上是关于Xamarin iOS Binding 项目似乎不包含库或接口定义的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Android 使用其他语言的类库

Xamarin 中的 Binding .

Xamarin.Android Binding 源自github第三方库的绑定(高级教学)----aar文件

自定义控件的 Xamarin 数据绑定值计算为 Xamarin.Forms.Binding

Xamarin.Android Binding-----百度地图SDK

Xamarin.Android Binding 源自github第三方库的绑定(中级教学)----aar文件