如何在 .net 6 中轻松地在 iOS 和 Mac Catalyst 之间共享代码?

How to easily share code between iOS and Mac Catalyst in .net 6?

我正在使用 SDK 样式的多目标项目将 Xamarin Native 解决方案升级到 运行 on .net 6。

据我了解,有两种编写平台相关代码的方法: a) 相应平台目录(例如“iOS”或“MacCatalyst”)内的代码始终针对该平台进行有条件编译。 b) 代码可以通过 #if IOS.

等显式条件编译

当两个平台之间共享大量代码时,这两种方法似乎都不理想。在 (a) 中,代码是重复的,在 (b) 中,代码散布着 #ifs.

有没有更好的方法在这两个平台之间共享代码?

我正在考虑在 Platforms/iOS 下创建一个“共享”文件夹 并将该文件夹符号链接到 Platforms/MacCatalyst/Shared.

仍在等待其他答案,以及对此问题的评论。

编辑:我在 Visual Studio For Mac 2022 上试过这个。Platforms/MacCatalyst/Shared 处的符号链接文件夹在解决方案资源管理器中显示为带有红色标题的单个文件,即它的子树不可见。但是,该项目符合 iOS 和 Mac Catalyst 的要求。由于可以从 Platforms/iOS/Shared 的原始位置访问共享代码,这看起来是有效的策略,尽管有些不受支持。

MSBuild Conditions可用于控制不同情况下的构建动作。

给定 <EnableDefaultCompileItems> 的默认值 true,最简单的方法是从目标中删除不应该拥有的文件夹。

目标是让(大部分)iOS 代码包含在 iOS 和 MacCatalyst 中;因此将其排除在所有其他目标框架之外。

步骤:

  • 在项目根目录下创建一个文件夹。例如。 iosShared.
  • 将要包含在 iOS 和 MacCatalyst 构建中的文件(和子文件夹)放在其中。
  • 默认情况下,这些文件将包含在所有目标中。通过添加到 YourProject.csproj:
  • 来停止
    <ItemGroup Condition="'$(TargetFramework)' != 'net6.0-ios' And
                          '$(TargetFramework)' != 'net6.0-maccatalyst'">
        <Compile Remove="iosShared\**\*" />
    </ItemGroup>