Skip to content

Move FixLegacyResourceDesignerStep to post-trim pipeline#11059

Open
sbomer wants to merge 3 commits intomainfrom
dev/sbomer/fix-resource-designer
Open

Move FixLegacyResourceDesignerStep to post-trim pipeline#11059
sbomer wants to merge 3 commits intomainfrom
dev/sbomer/fix-resource-designer

Conversation

@sbomer
Copy link
Copy Markdown
Member

@sbomer sbomer commented Mar 30, 2026

Migrate FixLegacyResourceDesignerStep out of the ILLink trimmer process and into PostTrimmingPipeline, continuing the work in #10842 to remove custom ILLink steps. The step now runs after ILLink via a thin wrapper (PostTrimmingFixLegacyResourceDesignerStep) that calls ProcessAssemblyDesigner() directly, matching the former ILLink behavior.

  • Remove all #if ILLINK conditionals from FixLegacyResourceDesignerStep, LinkDesignerBase, and BaseStep
  • Remove FixLegacyResourceDesignerStep and LinkDesignerBase from the ILLink project (no longer compiled as a trimmer step)
  • Add UseDesignerAssembly property to PostTrimmingPipeline task
  • Wire AndroidUseDesignerAssembly through targets to PostTrimmingPipeline
  • Remove _TrimmerCustomSteps entry for FixLegacyResourceDesignerStep

Migrate FixLegacyResourceDesignerStep out of the ILLink trimmer process
and into PostTrimmingPipeline, continuing the work in #10842 to remove
custom ILLink steps. The step now runs after ILLink via a thin wrapper
(PostTrimmingFixLegacyResourceDesignerStep) that calls
ProcessAssemblyDesigner() directly, matching the former ILLink behavior.

- Remove all #if ILLINK conditionals from FixLegacyResourceDesignerStep,
  LinkDesignerBase, and BaseStep
- Remove FixLegacyResourceDesignerStep and LinkDesignerBase from the
  ILLink project (no longer compiled as a trimmer step)
- Add UseDesignerAssembly property to PostTrimmingPipeline task
- Wire AndroidUseDesignerAssembly through targets to PostTrimmingPipeline
- Remove _TrimmerCustomSteps entry for FixLegacyResourceDesignerStep
Copilot AI review requested due to automatic review settings March 30, 2026 23:58
@sbomer sbomer changed the title [illink] Move FixLegacyResourceDesignerStep to post-trim pipeline Move FixLegacyResourceDesignerStep to post-trim pipeline Mar 30, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Moves FixLegacyResourceDesignerStep out of the ILLink custom-step mechanism and into the PostTrimmingPipeline MSBuild task so the legacy designer fix runs after ILLink, aligning with the ongoing effort to eliminate _TrimmerCustomSteps-based customization.

Changes:

  • Adds a UseDesignerAssembly switch to PostTrimmingPipeline and runs the legacy resource-designer fix via a thin post-trim wrapper.
  • Removes FixLegacyResourceDesignerStep / LinkDesignerBase from the Microsoft.Android.Sdk.ILLink project and deletes the corresponding _TrimmerCustomSteps registration.
  • Removes #if ILLINK conditional paths from the step/base classes now that they no longer compile into the ILLink step assembly.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.csproj Ensures linker-related sources used by PostTrimmingPipeline include LinkDesignerBase.
src/Xamarin.Android.Build.Tasks/Tasks/PostTrimmingPipeline.cs Adds UseDesignerAssembly and invokes the legacy designer fix post-ILLink via PostTrimmingFixLegacyResourceDesignerStep.
src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.TypeMap.LlvmIr.targets Removes _TrimmerCustomSteps registration for the legacy designer fix and wires AndroidUseDesignerAssembly into PostTrimmingPipeline.
src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/LinkDesignerBase.cs Removes ILLink-specific conditional logging paths.
src/Xamarin.Android.Build.Tasks/Linker/MonoDroid.Tuner/FixLegacyResourceDesignerStep.cs Makes the step unconditionally implement the post-trim pipeline interface and removes ILLink-only conditionals.
src/Xamarin.Android.Build.Tasks/Linker/External/Linker.Steps/BaseStep.cs Removes ILLink-specific conditional error logging path.
src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj Stops compiling FixLegacyResourceDesignerStep and LinkDesignerBase into the ILLink step assembly.

@jonathanpeppers
Copy link
Copy Markdown
Member

Somehow a lot of tests get an error like:

       "C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj" (Build;SignAndroidPackage target) (1:7) ->
       (_AfterILLinkAdditionalSteps target) -> 
         C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028: System.IO.FileNotFoundException: Could not load assembly 'netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. Perhaps it doesn't exist in the Mono for Android profile? [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028: File name: 'netstandard.dll' [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Java.Interop.Tools.Cecil.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Mono.Cecil.MetadataResolver.Resolve(TypeReference type) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Mono.Cecil.ModuleDefinition.Resolve(TypeReference type) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Mono.Cecil.TypeReference.Resolve() [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Java.Interop.Tools.Cecil.TypeDefinitionCache.Resolve(TypeReference typeReference) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Java.Interop.Tools.Cecil.TypeDefinitionRocks.GetBaseType(TypeDefinition type, IMetadataResolver resolver) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Java.Interop.Tools.Cecil.TypeDefinitionRocks.GetTypeAndBaseTypes(TypeDefinition type, IMetadataResolver resolver)+MoveNext() [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Java.Interop.Tools.Cecil.TypeDefinitionRocks.HasJavaPeer(TypeDefinition type, IMetadataResolver resolver) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Xamarin.Android.Tasks.XAJavaTypeScanner.AddJavaType(TypeDefinition type, List`1 types) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at MonoDroid.Tuner.FindJavaObjectsStep.ScanForJavaTypes(AssemblyDefinition assembly) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at MonoDroid.Tuner.FindJavaObjectsStep.ScanAssembly(AssemblyDefinition assembly, StepContext context, String destinationJLOXml) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at MonoDroid.Tuner.FindJavaObjectsStep.ProcessAssembly(AssemblyDefinition assembly, StepContext context) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Xamarin.Android.Tasks.AssemblyPipeline.Run(AssemblyDefinition assembly, StepContext context) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunPipeline(AssemblyPipeline pipeline, ITaskItem source, ITaskItem destination) [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Xamarin.Android.Tasks.AssemblyModifierPipeline.RunTask() [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]
       C:\a\_work\1\s\bin\Release\dotnet\packs\Microsoft.Android.Sdk.Windows\36.99.0-ci.dev-sbomer-fix-resource-designer.35\tools\Xamarin.Android.Common.targets(1463,3): error XAAMP7028:    at Microsoft.Android.Build.Tasks.AndroidTask.Execute() [C:\a\_work\1\a\TestRelease\03-31_00.22.18\temp\CSProjUserFileChangesNativeAOT\UnnamedProject.csproj]

Maybe the assembly resolver is missing some search directories? And that is what made it work before this change?

@sbomer sbomer self-assigned this Mar 31, 2026
sbomer added 2 commits April 1, 2026 16:22
In NativeAOT builds, _AddResourceDesignerToPublishFiles ran after
_ComputeManagedAssemblyToLink, so the designer assembly was not in
ManagedAssemblyToLink. ILLink skipped the designer assembly entirely
and did not rewrite its netstandard references.

Fix by adding _AddResourceDesignerToPublishFiles to _PrepareLinking's
DependsOnTargets, so the designer is passed to ILLink.
# Conflicts:
#	src/Microsoft.Android.Sdk.ILLink/Microsoft.Android.Sdk.ILLink.csproj
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants