我已阅读Xamarin的文档。
这是我在Objective-C中的测试类:
#import "XamarinBundleLib.h"
@implementation XamarinBundleLib
+(NSString *)testBinding{
return @"Hello Binding";
}
@end
这很容易,只有一种方法。
这是我的C#课程:
namespace ResloveName
{
[BaseType (typeof (NSObject))]
public partial interface IXamarinBundleLib {
[Static,Export ("testBinding")]
NSString TestBinding {get;}
}
}
然后这是我的AppDelegate代码:
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
// Override point for customization after application launch.
// If not required for your application you can safely delete this method
string testStr = ResloveName.IXamarinBundleLib.TestBinding.ToString ();
System.Console.WriteLine ("testStr="+testStr);
return true;
}
TestBinding属性为null。 我在某处肯定是错的,所以我该如何解决?
答案 0 :(得分:3)
我写了一篇非常详细的博客文章,关于去年从ObjC代码创建一个静态库,它适用于Xamarin.iOS绑定项目,你可以找到它here(以防万一:wink :: wink :)。
如果您手中已经有一个胖静态库,并且已经添加到您的Xamarin.iOS绑定项目中,如上所示:
问题可能是您的libxyz.linkwith.cs
缺少某些信息,如果它看起来像这样:
using ObjCRuntime;
[assembly: LinkWith ("libFoo.a", SmartLink = true, ForceLoad = true)]
它肯定缺少有关胖库支持的体系结构的一些重要信息(缺少第二个参数target
),您可以使用以下命令检索当前静态库支持的体系结构
xcrun -sdk iphoneos lipo -info path/to/your/libFoo.a
你应该得到像这样的输出
Architectures in the fat file: Foo/libFoo.a are: i386 armv7 x86_64 arm64
所以我们知道这个静态库支持i386 armv7 x86_64 arm64
,我们应该通过提供第二个参数LinkWith
来提供我们的target
属性支持的arch,如下所示:
using ObjCRuntime;
[assembly: LinkWith ("libFoo.a", LinkTarget.ArmV7 | LinkTarget.Arm64 | LinkTarget.Simulator | LinkTarget.Simulator64, SmartLink = true, ForceLoad = true)]
还要确保LinkWith
属性的第一个参数与静态库文件名匹配(在我的例子中为“libFoo.a”)。
我建议仔细检查的另一件事是,静态库的Build Action
(在我的情况下为libFoo.a
)正确设置为ObjcBindingNativeLibrary
,如下所示:
希望这有帮助!