Xamarin.Legacy.Sdk icon indicating copy to clipboard operation
Xamarin.Legacy.Sdk copied to clipboard

Classic Item Groups?

Open jonpryor opened this issue 3 years ago • 2 comments

From the description:

Starting from a .NET 6 project, adds the ability to target legacy Xamarin target frameworks such as monoandroid11.0 or xamarin.ios10.

How much additional work should be expected? Let's try this out:

dotnet new android -n xls-def-net6
cd xls-def-net6
sed -i .bk 's,^<Project Sdk="Microsoft.NET.Sdk">,<Project Sdk="Xamarin.Legacy.Sdk/0.1.0-alpha2">,g' xls-def-net6.csproj
dotnet build

Builds with $(TargetFramework)=net6.0-android. Now let's multitarget:

sed -i .bk2 's,<TargetFramework>net6.0-android</TargetFramework>,<TargetFrameworks>monoandroid12.0;net6.0-android</TargetFrameworks>,g' xls-def-net6.csproj
dotnet build

This -- predictably in retrospect -- fails to build:

MainActivity.cs(1,1): error CS8400: Feature 'file-scoped namespace' is not available in C# 8.0. Please use language version 10.0 or greater.

OK, so we update xls-def-net6.csproj so that $(ImplicitUsings)=disable, update MainActivity.cs so that it compiles without implicit usings, and…

MainActivity.cs(14,33): error CS0117: 'Resource' does not contain a definition for 'Layout'

Thus, the question: "how much" work is expected to target a Classic SDK when starting from .NET 6?

I can get this "default .NET 6. project" to build monoandroid12.0 by adding:

  <ItemGroup>
    <AndroidResource Include="Resources\**\*" />
    <AndroidResource Remove="Resources\AboutResources.txt" />
  </ItemGroup>

Should this be expected? Should we add some default item groups for Classic?

What about creating .apk/.aab files? dotnet build -t:SignAndroidPackage doesn't work:

xls-def-net6.csproj : error MSB4057: The target "SignAndroidPackage" does not exist in the project.

You can set $(AndroidBuildApplicationPackage)=True:

% dotnet build -p:AndroidBuildApplicationPackage=True
% ls -l bin/Debug/*/*.apk
-rw-r--r--  1 jon  staff  13959540 Jul 12 15:20 bin/Debug/monoandroid12.0/com.companyname.xls_def_net6-Signed.apk
-rw-r--r--  1 jon  staff  13945727 Jul 12 15:20 bin/Debug/monoandroid12.0/com.companyname.xls_def_net6.apk
-rw-r--r--  1 jon  staff   2493165 Jul 12 15:18 bin/Debug/net6.0-android/com.companyname.xls_def_net6-Signed.apk
-rw-r--r--  1 jon  staff   2482972 Jul 12 15:17 bin/Debug/net6.0-android/com.companyname.xls_def_net6.apk

Is this expected?

jonpryor avatar Jul 12 '22 19:07 jonpryor

To some extent, instead of "Start from a .NET 6 project, add Classic builds", a "modified opposite" perspective may be more accurate: start with a Classic (long-form) Project, then hand-edit your way to Classic + .NET 6 multitargeting. With Classic as a starting point, @(AndroidResource)/etc. will already be used, thus ensuring that Classic continues to build.

jonpryor avatar Jul 12 '22 19:07 jonpryor

Given Xamarin.Legacy.Sdk only has ~5k downloads, maybe it's not worth looking into these? A lot of it appears to be C# 10 changes.

@jonpryor did you try MSBuild.Sdk.Extras, to see if they fare any better.

I would also test a class library, as I'm not sure the point of multi-targeting an "app" project.

jonathanpeppers avatar Jul 14 '22 14:07 jonathanpeppers