diff --git a/src/Controls/src/Build.Tasks/ModuleDefinitionExtensions.cs b/src/Controls/src/Build.Tasks/ModuleDefinitionExtensions.cs index 41fe0c965666..34c33621cbdd 100644 --- a/src/Controls/src/Build.Tasks/ModuleDefinitionExtensions.cs +++ b/src/Controls/src/Build.Tasks/ModuleDefinitionExtensions.cs @@ -254,7 +254,8 @@ public static TypeDefinition GetTypeDefinition(this ModuleDefinition module, Xam { return cache.GetOrAddTypeDefinition(module, type, x => { - var asm = module.Assembly.Name.Name == type.assemblyName + var assemblyName = module.Assembly.Name; + var asm = (assemblyName.Name == type.assemblyName || assemblyName.FullName == type.assemblyName) ? module.Assembly : module.AssemblyResolver.Resolve(AssemblyNameReference.Parse(type.assemblyName)); var typeDef = asm.MainModule.GetType($"{type.clrNamespace}.{type.typeName}"); diff --git a/src/Controls/src/Build.Tasks/XmlTypeExtensions.cs b/src/Controls/src/Build.Tasks/XmlTypeExtensions.cs index f11ac9eb3b88..dc659e7bc4b4 100644 --- a/src/Controls/src/Build.Tasks/XmlTypeExtensions.cs +++ b/src/Controls/src/Build.Tasks/XmlTypeExtensions.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Linq; using System.Xml; -using Microsoft.Maui.Controls.Internals; using Microsoft.Maui.Controls.Xaml; using Mono.Cecil; using Mono.Cecil.Rocks; @@ -10,6 +9,8 @@ namespace Microsoft.Maui.Controls.Build.Tasks { static class XmlTypeExtensions { + static readonly string _xmlnsDefinitionName = typeof(XmlnsDefinitionAttribute).FullName; + static IList GatherXmlnsDefinitionAttributes(ModuleDefinition module) { var xmlnsDefinitions = new List(); @@ -18,17 +19,11 @@ static IList GatherXmlnsDefinitionAttributes(ModuleDef { // Search for the attribute in the assemblies being // referenced. + GatherXmlnsDefinitionAttributes(xmlnsDefinitions, module.Assembly); foreach (var asmRef in module.AssemblyReferences) { var asmDef = module.AssemblyResolver.Resolve(asmRef); - foreach (var ca in asmDef.CustomAttributes) - { - if (ca.AttributeType.FullName == typeof(XmlnsDefinitionAttribute).FullName) - { - var attr = GetXmlnsDefinition(ca, asmDef); - xmlnsDefinitions.Add(attr); - } - } + GatherXmlnsDefinitionAttributes(xmlnsDefinitions, asmDef); } } else @@ -50,6 +45,18 @@ static IList GatherXmlnsDefinitionAttributes(ModuleDef return xmlnsDefinitions; } + static void GatherXmlnsDefinitionAttributes(List xmlnsDefinitions, AssemblyDefinition asmDef) + { + foreach (var ca in asmDef.CustomAttributes) + { + if (ca.AttributeType.FullName == _xmlnsDefinitionName) + { + var attr = GetXmlnsDefinition(ca, asmDef); + xmlnsDefinitions.Add(attr); + } + } + } + public static TypeReference GetTypeReference(XamlCache cache, string typeName, ModuleDefinition module, BaseNode node, bool expandToExtension = true) { try @@ -97,7 +104,7 @@ public static TypeReference GetTypeReference(this XmlType xmlType, XamlCache cac throw new BuildException(BuildExceptionCode.TypeResolution, xmlInfo, null, $"{xmlType.NamespaceUri}:{xmlType.Name}"); } - public static XmlnsDefinitionAttribute GetXmlnsDefinition(this CustomAttribute ca, AssemblyDefinition asmDef) + static XmlnsDefinitionAttribute GetXmlnsDefinition(this CustomAttribute ca, AssemblyDefinition asmDef) { var attr = new XmlnsDefinitionAttribute( ca.ConstructorArguments[0].Value as string, diff --git a/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDef.xaml b/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDef.xaml new file mode 100644 index 000000000000..33fc027629a6 --- /dev/null +++ b/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDef.xaml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDef.xaml.cs b/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDef.xaml.cs new file mode 100644 index 000000000000..859d4afa6154 --- /dev/null +++ b/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDef.xaml.cs @@ -0,0 +1,43 @@ +using Microsoft.Maui.ApplicationModel; +using Microsoft.Maui.Controls.Core.UnitTests; +using Microsoft.Maui.Dispatching; + +using Microsoft.Maui.UnitTests; +using NUnit.Framework; + + +namespace Microsoft.Maui.Controls.Xaml.UnitTests; +[XamlCompilation(XamlCompilationOptions.Skip)] +public partial class MauiXmlnsDef +{ + public MauiXmlnsDef() + { + InitializeComponent(); + } + + public MauiXmlnsDef(bool useCompiledXaml) + { + //this stub will be replaced at compile time + } + + [TestFixture] + class Test + { + [SetUp] + public void Setup() + { + Application.SetCurrentApplication(new MockApplication()); + DispatcherProvider.SetCurrent(new DispatcherProviderStub()); + } + + [TearDown] public void TearDown() => AppInfo.SetCurrent(null); + + [Test] + public void XamlParseXmlnsDefinitionForThisAssembly([Values(false, true)] bool useCompiledXaml) + { + if (useCompiledXaml) + MockCompiler.Compile(typeof(MauiXmlnsDef)); + new MauiXmlnsDef(useCompiledXaml); + } + } +} diff --git a/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDefControl.cs b/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDefControl.cs new file mode 100644 index 000000000000..d80363fcab2e --- /dev/null +++ b/src/Controls/tests/Xaml.UnitTests/Issues/MauiXmlnsDefControl.cs @@ -0,0 +1,6 @@ +using Microsoft.Maui.Controls; + +[assembly: XmlnsDefinition("http://schemas.microsoft.com/dotnet/2021/maui", "Microsoft.Maui.Controls.Xaml.UnitTests.XmlnsDef")] + +namespace Microsoft.Maui.Controls.Xaml.UnitTests.XmlnsDef; +public class MauiXmlnsDefControl : Label { }