xamarin 将原生iOS库添加到MAUI项目

zaqlnxep  于 2023-04-03  发布在  iOS
关注(0)|答案(1)|浏览(211)

我用MAUI开发了一个应用程序(仅适用于iOS),需要使用一个用Xamarin.iOS编写的库,它有一个静态的原生库(一个文件)
我无法使用xamarin项目,所以我只是创建了一个新的Maui类库项目,并将代码移动到这个项目中,并添加了一个文件作为本机库

<ItemGroup>
    <ObjcBindingNativeLibrary Include="libAreteUart\a" />
</ItemGroup>

然后我将这个类库添加到我的Maui应用程序项目中,当我尝试构建它时,我得到了以下错误

/usr/local/share/dotnet/packs/Microsoft.iOS.Sdk/16.2.1007/targets/Xamarin.Shared.Sdk.targets(3,3): 
Error: clang++ exited with code 1:
Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_ComboBarcodeApi", referenced from:
      objc-class-ref in registrar.o
  "_OBJC_CLASS_$_ComboNFCApi", referenced from:
      objc-class-ref in registrar.o
  "_OBJC_CLASS_$_ComboRFIDApi", referenced from:
      objc-class-ref in registrar.o
  "_OBJC_CLASS_$_CommonDevice", referenced from:
      objc-class-ref in registrar.o
  "_OBJC_CLASS_$_CommonReaderInfo", referenced from:
      objc-class-ref in registrar.o
  "_OBJC_CLASS_$_RcpApi", referenced from:
      objc-class-ref in registrar.o
  "_OBJC_CLASS_$_SDeviceApi", referenced from:
      objc-class-ref in registrar.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation) (TestMauiApp)

据我所知,Register属性有一个问题。
PS:通过我尝试的方式,不链接,只有SDK和链接所有选项,但得到了同样的错误

// Token: 0x02000003 RID: 3
    [Register("ComboBarcodeApi", true)]
    public class ComboBarcodeApi : SDeviceApi
    {
        // Token: 0x17000001 RID: 1
        // (get) Token: 0x06000059 RID: 89 RVA: 0x0000206E File Offset: 0x0000026E
        public override NativeHandle ClassHandle
        {
            get
            {
                return ComboBarcodeApi.class_ptr;
            }
        }

        // Token: 0x0600005A RID: 90 RVA: 0x00002078 File Offset: 0x00000278
        [CompilerGenerated]
        [EditorBrowsable(EditorBrowsableState.Advanced)]
        [Export("init")]
        public ComboBarcodeApi() : base(NSObjectFlag.Empty)
        {
            base.IsDirectBinding = (base.GetType().Assembly == Messaging.this_assembly);
            if (base.IsDirectBinding)
            {
                base.InitializeHandle(Messaging.IntPtr_objc_msgSend(base.Handle, Selector.GetHandle("init")), "init");
                return;
            }
            base.InitializeHandle(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, Selector.GetHandle("init")), "init");
        }
     .....
}

我在这里发现了一个类似的问题,但没有答案或解决办法
https://github.com/xamarin/xamarin-macios/issues/17196

xcitsw88

xcitsw881#

我有一个类似的问题.我昨天刚刚修复了它.也许这可以为你工作.单独去每个文件,你在错误日志中看到.下面,

  • 这个问题是由于旧的注解。在Xamarin中工作的注解实际上在MAUI中不工作。
  • 在我的情况下,在Xamarin它是,
// @protocol TestViewControllerDelegate <NSObject>
    [Protocol, Model(AutoGeneratedName = true)]
    [BaseType(typeof(NSObject))]
    interface TestViewControllerDelegate
  • 在MAUI中修复,
// @protocol TestViewControllerDelegate <NSObject>
    [Protocol, Model]
    [BaseType(typeof(NSObject))]
    interface TestViewControllerDelegate
  • 因此,我建议您参考上面错误中提到的每个文件,以检查MAUI中支持的注解。

可悲的是,绑定库不会在每个文件中单独显示错误。这也意味着没有代码自动建议。所以只要按照错误窗口中打印的内容即可。还有一些跟踪和错误部分。祝你好运!

相关问题