public XamlType ResolveType(ushort id) { XamlType xamlType; if (typeMap.TryGetValue(id, out xamlType)) { return(xamlType); } ITypeDefOrRef type; IAssembly assembly; if (id > 0x7fff) { type = Baml.KnownThings.Types((KnownTypes)(-id)); assembly = type.DefinitionAssembly; } else { var typeRec = Baml.TypeIdMap[id]; assembly = Baml.ResolveAssembly(typeRec.AssemblyId); type = TypeNameParser.ParseReflectionThrow(Module, typeRec.TypeFullName, new DummyAssemblyRefFinder(assembly)); } var clrNs = type.ReflectionNamespace; var xmlNs = XmlNs.LookupXmlns(assembly, clrNs); typeMap[id] = xamlType = new XamlType(assembly, clrNs, type.ReflectionName, GetXmlNamespace(xmlNs)) { ResolvedType = type }; return(xamlType); }
public XamlType ResolveType(ushort id) { if (typeMap.TryGetValue(id, out var xamlType)) { return(xamlType); } IType type; IModule assembly; if (id > 0x7fff) { type = Baml.KnownThings.Types((KnownTypes)(short)-unchecked ((short)id)); assembly = type.GetDefinition().ParentModule; } else { var typeRec = Baml.TypeIdMap[id]; assembly = Baml.ResolveAssembly(typeRec.AssemblyId); type = ReflectionHelper.ParseReflectionName(typeRec.TypeFullName).Resolve(new SimpleTypeResolveContext(TypeSystem)); } var clrNs = type.Namespace; var xmlNs = XmlNs.LookupXmlns(assembly, clrNs); typeMap[id] = xamlType = new XamlType(assembly, clrNs, type.Name, GetXmlNamespace(xmlNs)) { ResolvedType = type }; return(xamlType); }
void BuildPIMappings(BamlDocument document) { foreach (var record in document) { var piMap = record as PIMappingRecord; if (piMap is null) { continue; } XmlNs.SetPIMapping(piMap.XmlNamespace, piMap.ClrNamespace, Baml.ResolveAssembly(piMap.AssemblyId)); } }
private static HashSet <AssemblyName> FindXamlReferences([NotNull] IDictionary <string, AssemblyName> existingAssemblies, [NotNull] ModuleDefinition assembly) { var assemblyResources = assembly.Resources?.OfType <EmbeddedResource>().FirstOrDefault(res => res.Name?.EndsWith("g.resources", StringComparison.Ordinal) == true); var usedAssemblies = new HashSet <AssemblyName>(); if (assemblyResources == null) { return(usedAssemblies); } var resourceStream = assemblyResources.GetResourceStream(); if (resourceStream == null) { return(usedAssemblies); } using (var resourceReader = new ResourceReader(resourceStream)) { foreach (DictionaryEntry entry in resourceReader) { if ((entry.Key as string)?.EndsWith(".baml", StringComparison.Ordinal) != true) { continue; } if (!(entry.Value is Stream bamlStream)) { continue; } var records = Baml.ReadDocument(bamlStream); foreach (var name in records.OfType <AssemblyInfoRecord>().Select(ai => new AssemblyName(ai.AssemblyFullName))) { // ReSharper disable once AssignNullToNotNullAttribute if (existingAssemblies.TryGetValue(name.Name, out var assemblyName) && ((name.Version == null) || (name.Version <= assemblyName.Version))) { usedAssemblies.Add(assemblyName); } } } } return(usedAssemblies); }