コード例 #1
0
ファイル: BAMLAnalyzer.cs プロジェクト: 2sic4you/ConfuserEx
        private void PopulateReferences(BamlDocument document)
        {
            var clrNs = new Dictionary<string, List<Tuple<AssemblyDef, string>>>();

            assemblyRefs.Clear();
            foreach (AssemblyInfoRecord rec in document.OfType<AssemblyInfoRecord>()) {
                AssemblyDef assembly = context.Resolver.ResolveThrow(rec.AssemblyFullName, module);
                assemblyRefs.Add(rec.AssemblyId, assembly);

                if (!context.Modules.Any(m => m.Assembly == assembly))
                    continue;

                foreach (CustomAttribute attr in assembly.CustomAttributes.FindAll("System.Windows.Markup.XmlnsDefinitionAttribute")) {
                    clrNs.AddListEntry(
                        (UTF8String)attr.ConstructorArguments[0].Value,
                        Tuple.Create(assembly, (string)(UTF8String)attr.ConstructorArguments[1].Value));
                }
            }

            xmlnsCtx = new XmlNsContext(document, assemblyRefs);

            typeRefs.Clear();
            foreach (TypeInfoRecord rec in document.OfType<TypeInfoRecord>()) {
                AssemblyDef assembly;
                var asmId = (short)(rec.AssemblyId & 0xfff);
                if (asmId == -1)
                    assembly = things.FrameworkAssembly;
                else
                    assembly = assemblyRefs[(ushort)asmId];

                // WPF uses Assembly.GetType to load it, so if no assembly specified in the TypeSig, it must be in current assembly.
                AssemblyDef assemblyRef = module.Assembly == assembly ?
                                              null : context.Resolver.ResolveThrow(module.GetAssemblyRefs().Single(r => r.FullName == assembly.FullName), module);

                TypeSig typeSig = TypeNameParser.ParseAsTypeSigReflectionThrow(module, rec.TypeFullName, new DummyAssemblyRefFinder(assemblyRef));
                typeRefs[rec.TypeId] = typeSig;

                AddTypeSigReference(typeSig, new BAMLTypeReference(typeSig, rec));
            }

            attrRefs.Clear();
            foreach (AttributeInfoRecord rec in document.OfType<AttributeInfoRecord>()) {
                TypeSig declType;
                if (typeRefs.TryGetValue(rec.OwnerTypeId, out declType)) {
                    TypeDef type = declType.ToBasicTypeDefOrRef().ResolveTypeDefThrow();
                    attrRefs[rec.AttributeId] = AnalyzeAttributeReference(type, rec);
                }
                else {
                    Debug.Assert((short)rec.OwnerTypeId < 0);
                    TypeDef declTypeDef = things.Types((KnownTypes)(-(short)rec.OwnerTypeId));
                    attrRefs[rec.AttributeId] = AnalyzeAttributeReference(declTypeDef, rec);
                }
            }

            strings.Clear();
            foreach (StringInfoRecord rec in document.OfType<StringInfoRecord>()) {
                strings[rec.StringId] = rec;
            }

            foreach (PIMappingRecord rec in document.OfType<PIMappingRecord>()) {
                var asmId = (short)(rec.AssemblyId & 0xfff);
                AssemblyDef assembly;
                if (asmId == -1)
                    assembly = things.FrameworkAssembly;
                else
                    assembly = assemblyRefs[(ushort)asmId];

                Tuple<AssemblyDef, string> scope = Tuple.Create(assembly, rec.ClrNamespace);
                clrNs.AddListEntry(rec.XmlNamespace, scope);
            }

            xmlns.Clear();
            foreach (XmlnsPropertyRecord rec in document.OfType<XmlnsPropertyRecord>()) {
                List<Tuple<AssemblyDef, string>> clrMap;
                if (clrNs.TryGetValue(rec.XmlNamespace, out clrMap)) {
                    xmlns[rec.Prefix] = clrMap;
                    foreach (var scope in clrMap)
                        xmlnsCtx.AddNsMap(scope, rec.Prefix);
                }
            }
        }
コード例 #2
0
ファイル: BAMLAnalyzer.cs プロジェクト: ravselj/ConfuserEx
        private void PopulateReferences(BamlDocument document)
        {
            var clrNs = new Dictionary <string, List <Tuple <AssemblyDef, string> > >();

            assemblyRefs.Clear();
            foreach (AssemblyInfoRecord rec in document.OfType <AssemblyInfoRecord>())
            {
                AssemblyDef assembly = context.Resolver.ResolveThrow(rec.AssemblyFullName, module);
                assemblyRefs.Add(rec.AssemblyId, assembly);

                if (!context.Modules.Any(m => m.Assembly == assembly))
                {
                    continue;
                }

                foreach (CustomAttribute attr in assembly.CustomAttributes.FindAll("System.Windows.Markup.XmlnsDefinitionAttribute"))
                {
                    clrNs.AddListEntry(
                        (UTF8String)attr.ConstructorArguments[0].Value,
                        Tuple.Create(assembly, (string)(UTF8String)attr.ConstructorArguments[1].Value));
                }
            }

            xmlnsCtx = new XmlNsContext(document, assemblyRefs);

            typeRefs.Clear();
            foreach (TypeInfoRecord rec in document.OfType <TypeInfoRecord>())
            {
                AssemblyDef assembly;
                var         asmId = (short)(rec.AssemblyId & 0xfff);
                if (asmId == -1)
                {
                    assembly = things.FrameworkAssembly;
                }
                else
                {
                    assembly = assemblyRefs[(ushort)asmId];
                }

                AssemblyDef assemblyRef = module.Assembly == assembly ? null : assembly;

                TypeSig typeSig = TypeNameParser.ParseAsTypeSigReflectionThrow(module, rec.TypeFullName, new DummyAssemblyRefFinder(assemblyRef));
                typeRefs[rec.TypeId] = typeSig;

                AddTypeSigReference(typeSig, new BAMLTypeReference(typeSig, rec));
            }

            attrRefs.Clear();
            foreach (AttributeInfoRecord rec in document.OfType <AttributeInfoRecord>())
            {
                TypeSig declType;
                if (typeRefs.TryGetValue(rec.OwnerTypeId, out declType))
                {
                    TypeDef type = declType.ToBasicTypeDefOrRef().ResolveTypeDefThrow();
                    attrRefs[rec.AttributeId] = AnalyzeAttributeReference(type, rec);
                }
                else
                {
                    Debug.Assert((short)rec.OwnerTypeId < 0);
                    TypeDef declTypeDef = things.Types((KnownTypes)(-(short)rec.OwnerTypeId));
                    attrRefs[rec.AttributeId] = AnalyzeAttributeReference(declTypeDef, rec);
                }
            }

            strings.Clear();
            foreach (StringInfoRecord rec in document.OfType <StringInfoRecord>())
            {
                strings[rec.StringId] = rec;
            }

            foreach (PIMappingRecord rec in document.OfType <PIMappingRecord>())
            {
                var         asmId = (short)(rec.AssemblyId & 0xfff);
                AssemblyDef assembly;
                if (asmId == -1)
                {
                    assembly = things.FrameworkAssembly;
                }
                else
                {
                    assembly = assemblyRefs[(ushort)asmId];
                }

                Tuple <AssemblyDef, string> scope = Tuple.Create(assembly, rec.ClrNamespace);
                clrNs.AddListEntry(rec.XmlNamespace, scope);
            }

            xmlns.Clear();
            foreach (XmlnsPropertyRecord rec in document.OfType <XmlnsPropertyRecord>())
            {
                List <Tuple <AssemblyDef, string> > clrMap;
                if (clrNs.TryGetValue(rec.XmlNamespace, out clrMap))
                {
                    xmlns[rec.Prefix] = clrMap;
                    foreach (var scope in clrMap)
                    {
                        xmlnsCtx.AddNsMap(scope, rec.Prefix);
                    }
                }
            }
        }