示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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));
            }
        }
示例#4
0
        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);
        }