Xamarin.iOS 绑定项目迁移

将 Xamarin.iOS 绑定库迁移到 .NET for iOS 绑定库:

  1. 在 Visual Studio 中,新建一个与 Xamarin.iOS 绑定项目同名的 iOS 绑定库项目:

    在 Visual Studio 中创建 iOS 绑定库项目的屏幕截图。

    打开项目文件以确认你有一个 .NET SDK 样式项目:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>net8.0-ios</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>true</ImplicitUsings>
        <IsBindingProject>true</IsBindingProject>
      </PropertyGroup>
    
      <ItemGroup>
        <ObjcBindingApiDefinition Include="ApiDefinition.cs" />
        <ObjcBindingCoreSource Include="StructsAndEnums.cs" />
      </ItemGroup>
    </Project>
    

    注意

    iOS 绑定库的项目文件类似于 iOS 类库的项目文件。

  2. 将本机库或本机框架作为本机引用添加到项目。 然后使用 Xamarin.iOS 绑定项目中的 <NativeReference> 项更新绑定项目文件:

    <ItemGroup>
        <NativeReference Include="libXMBindingLibraryUniversal.a">
            <Kind>Static</Kind>
            <ForceLoad>True</ForceLoad>
        </NativeReference>
    </ItemGroup>
    
  3. 将 Xamarin.iOS 绑定项目中的 API 定义复制到 .NET for iOS 绑定项目。

  4. 将 Xamarin.iOS 绑定项目中的任何其他必需代码复制到 .NET for iOS 绑定项目。

  5. 在 .NET for iOS 绑定项目中,将任何不受支持的 API 替换为其 .NET for iOS 对等项。 有关详细信息,请参阅不支持的 API

不受支持的 API

以下 Xamarin.iOS API 已更改。

System.nint 和 System.nunit

System.nintSystem.nuint 类型在 .NET for iOS 中不可用。 相反,它们由 nintnuint 类型替换,并分别映射到 System.IntPtrSystem.UIntPtr。 使用 System.nintSystem.nuint 类型的代码不会编译,应替换为 nintnuint 类型。 此外,在 System.IntPtrnint 以及 System.UIntPtrnuint 上重载的代码不会编译。 在此方案中,对其中一个重载重命名或删除。

System.nfloat

System.nfloat 类型在 .NET for iOS 中不可用。 而是由 System.Runtime.InteropServices.NFloat 类型替代。 修改引用 System.nfloat 的任何代码,以使用 nfloat 或完全限定的类型名称。

NSObject.Handle 类型更改

在 .NET for iOS 中,NSObject.HandleINativeObject.Handle 属性已将类型从 System.IntPtr 更改为 ObjCRuntime.NativeHandle 结构。 这意味着许多参数和返回值都需要更改类型。 例如:

  • Foundation.NSObject 继承的所有对象,如果具有 IntPtr 类型的 ClassHandleHandle 属性,则应当将其属性类型更改为 ObjCRuntime.NativeHandle
  • Foundation.NSObjectObjCRuntime.DisposableObject 继承的所有对象,如果具有之前采用 System.IntPtrSystem.IntPtr 以及 bool 的构造函数,则应当将 IntPtr 引用更改为 ObjcRuntime.NativeHandle

System.IntPtrObjCRuntime.NativeHandler 之间存在隐式转换,因此在进行此类型更改后,大多数代码都应编译,而无需进一步更改。

Model.AutoGeneratedName

Model.AutoGeneratedName 属性在 .NET for iOS 中不可用。 在 Xamarin.iOS 中,此属性指定是否应自动生成模型的 Objective-C 类型名称。 在 .NET for iOS 中,从模型自动生成 Objective-C 类型名称是默认的行为,也是唯一可用的行为。