Ejemplo n.º 1
0
        public static List<KeyValuePair<Module, int>> GetVisibleExtensionMethods(Assembly assembly) {
            if (assembly == null) {
                throw new ArgumentNullException("assembly");
            }

            MetadataTables manifest = GetAsseblyMetadata(assembly)[0];
            MetadataRecord eaCtor = GetExtensionAttributeCtor(manifest);
            var result = new List<KeyValuePair<Module, int>>();
            if (!eaCtor.IsNull) {
                foreach (CustomAttributeDef ca in manifest.CustomAttributes) {
                    if (ca.Constructor.Equals(eaCtor) && ca.Parent.IsMethodDef) {
                        MethodDef mdef = ca.Parent.MethodDef;
                        var mattrs = mdef.Attributes;
                        if ((mattrs & MethodAttributes.MemberAccessMask) == MethodAttributes.Public && (mattrs & MethodAttributes.Static) != 0) {
                            var declType = mdef.FindDeclaringType();
                            var tattrs = declType.Attributes;
                            if (((tattrs & TypeAttributes.VisibilityMask) == TypeAttributes.Public ||
                                (tattrs & TypeAttributes.VisibilityMask) == TypeAttributes.NestedPublic) &&
                                (tattrs & TypeAttributes.Abstract) != 0 &&
                                (tattrs & TypeAttributes.Sealed) != 0) {
                                result.Add(new KeyValuePair<Module, int>(manifest.Module, mdef.Record.Token.Value));
                            }
                        }
                    }
                }
            }
            return result;
        }
Ejemplo n.º 2
0
        internal MetadataTableEnumerator(MetadataRecord parent, MetadataTokenType type)
        {
            Debug.Assert(parent.IsValid);

            m_type = type;
            m_tables = parent.m_tables;

            int start, count;
            m_indirection = parent.m_tables.m_import.GetEnumeratorRange(type, parent.Token, out start, out count);

            m_startRid = start;
            m_endRid = start + count;
            m_currentRid = start - 1;
        }
        internal MetadataTableEnumerator(MetadataRecord parent, MetadataTokenType type)
        {
            Debug.Assert(parent.IsValid);

            m_type   = type;
            m_tables = parent.m_tables;

            int start, count;

            m_indirection = parent.m_tables.m_import.GetEnumeratorRange(type, parent.Token, out start, out count);

            m_startRid   = start;
            m_endRid     = start + count;
            m_currentRid = start - 1;
        }
Ejemplo n.º 4
0
 internal InterfaceImpl(MetadataRecord record)
 {
     Contract.Requires(record.IsInterfaceImpl && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 5
0
 internal MethodSpec(MetadataRecord record)
 {
     Contract.Requires(record.IsMethodSpec && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 6
0
 internal PropertyDef(MetadataRecord record)
 {
     Contract.Requires(record.IsProperty && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 7
0
        private static string MethodToString(MetadataRecord record)
        {
            if (record.IsNull) {
                return "<none>";
            }

            switch (record.Type) {
                case MetadataRecordType.MethodDef:
                    var methodDef = record.MethodDef;
                    var parent = methodDef.FindDeclaringType();
                    return String.Format("def({0}.{1}::{2})", parent.Namespace, parent.Name, methodDef.Name);

                case MetadataRecordType.MemberRef:
                    var memberRef = record.MemberRef;
                    return String.Format("ref({0}::{1}|{2})", TypeToString(memberRef.Class), memberRef.Name, SignatureToString(memberRef.Signature));

                case MetadataRecordType.MethodSpec:
                    var methodSpec = record.MethodSpec;
                    return String.Format("spec({0})", SignatureToString(methodSpec.Signature));
            }

            throw new InvalidOperationException("Unknown method token");
        }
Ejemplo n.º 8
0
 internal GenericParamDef(MetadataRecord record)
 {
     Contract.Requires(record.IsGenericParamDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 9
0
 internal ManifestResourceDef(MetadataRecord record)
 {
     Contract.Requires(record.IsManifestResourceDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 10
0
 internal AssemblyRef(MetadataRecord record)
 {
     Contract.Requires(record.IsAssemblyRef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 11
0
 internal InterfaceImpl(MetadataRecord record)
 {
     Contract.Requires(record.IsInterfaceImpl && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 12
0
 internal GenericParamDef(MetadataRecord record)
 {
     Contract.Requires(record.IsGenericParamDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 13
0
 internal EventDef(MetadataRecord record)
 {
     Contract.Requires(record.IsEvent && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 14
0
 internal CustomAttributeDef(MetadataRecord record)
 {
     Contract.Requires(record.IsCustomAttributeDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 15
0
 internal TypeNesting(MetadataRecord record)
 {
     Contract.Requires(record.IsTypeNesting && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 16
0
 internal SignatureDef(MetadataRecord record)
 {
     Contract.Requires(record.IsSignatureDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 17
0
        private static string TypeToString(MetadataRecord record)
        {
            if (record.IsNull) {
                return "<none>";
            }

            switch (record.Type) {
                case MetadataRecordType.TypeDef:
                    var typeDef = record.TypeDef;
                    return String.Format("def({0}.{1})", typeDef.Namespace, typeDef.Name);

                case MetadataRecordType.TypeRef:
                    var typeRef = record.TypeRef;
                    return String.Format("ref({0}.{1})", typeRef.TypeNamespace, typeRef.TypeName);

                case MetadataRecordType.TypeSpec:
                    var typeSpec = record.TypeSpec;
                    return String.Format("spec({0})", SignatureToString(typeSpec.Signature));
            }

            throw new InvalidOperationException("Unknown type token");
        }
Ejemplo n.º 18
0
 internal CustomAttributeDef(MetadataRecord record)
 {
     Contract.Requires(record.IsCustomAttributeDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 19
0
 internal PropertyDef(MetadataRecord record)
 {
     Contract.Requires(record.IsProperty && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 20
0
 internal ManifestResourceDef(MetadataRecord record)
 {
     Contract.Requires(record.IsManifestResourceDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 21
0
 internal FileDef(MetadataRecord record)
 {
     Contract.Requires(record.IsFileDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 22
0
 internal AssemblyDef(MetadataRecord record)
 {
     Contract.Requires(record.IsAssemblyDef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 23
0
 internal TypeNesting(MetadataRecord record)
 {
     Contract.Requires(record.IsTypeNesting && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 24
0
 private static void DumpGenericParameters(MetadataTableView genericParams, MetadataRecord owner)
 {
     foreach (GenericParamDef gp in genericParams) {
         _output.WriteLine("  generic parameter #{0}: {1}", gp.Index, gp.Name, gp.Attributes);
         Debug.Assert(gp.Owner.Equals(owner));
         foreach (GenericParamConstraint gpc in gp.Constraints) {
             _output.WriteLine("    constraint {0}", TypeToString(gpc.Constraint));
             Debug.Assert(gpc.Owner.Record.Equals(gp.Record));
         }
         if (Detailed) {
             DumpCustomAttributes(gp.CustomAttributes, "    ");
         }
     }
 }
Ejemplo n.º 25
0
 internal MethodSpec(MetadataRecord record)
 {
     Contract.Requires(record.IsMethodSpec && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 26
0
 private static string ImplementationToString(MetadataRecord impl)
 {
     if (impl.IsFileDef) {
         return "file(" + impl.FileDef.Name + ")";
     } else if (impl.IsAssemblyRef) {
         return "assembly(" + impl.AssemblyRef.Name + ")";
     } else {
         Debug.Assert(impl.IsNull);
         return "<no-impl>";
     }
 }
Ejemplo n.º 27
0
 internal ModuleRef(MetadataRecord record)
 {
     Contract.Requires(record.IsModuleRef && record.Tables.IsValidToken(record.Token));
     m_record = record;
 }
Ejemplo n.º 28
0
 internal MetadataTableView(MetadataRecord parent, MetadataTokenType type)
 {
     m_type   = type;
     m_parent = parent;
 }