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; }
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; }
internal InterfaceImpl(MetadataRecord record) { Contract.Requires(record.IsInterfaceImpl && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal MethodSpec(MetadataRecord record) { Contract.Requires(record.IsMethodSpec && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal PropertyDef(MetadataRecord record) { Contract.Requires(record.IsProperty && record.Tables.IsValidToken(record.Token)); m_record = record; }
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"); }
internal GenericParamDef(MetadataRecord record) { Contract.Requires(record.IsGenericParamDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal ManifestResourceDef(MetadataRecord record) { Contract.Requires(record.IsManifestResourceDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal AssemblyRef(MetadataRecord record) { Contract.Requires(record.IsAssemblyRef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal InterfaceImpl(MetadataRecord record) { Contract.Requires(record.IsInterfaceImpl && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal GenericParamDef(MetadataRecord record) { Contract.Requires(record.IsGenericParamDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal EventDef(MetadataRecord record) { Contract.Requires(record.IsEvent && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal CustomAttributeDef(MetadataRecord record) { Contract.Requires(record.IsCustomAttributeDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal TypeNesting(MetadataRecord record) { Contract.Requires(record.IsTypeNesting && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal SignatureDef(MetadataRecord record) { Contract.Requires(record.IsSignatureDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
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"); }
internal CustomAttributeDef(MetadataRecord record) { Contract.Requires(record.IsCustomAttributeDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal PropertyDef(MetadataRecord record) { Contract.Requires(record.IsProperty && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal ManifestResourceDef(MetadataRecord record) { Contract.Requires(record.IsManifestResourceDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal FileDef(MetadataRecord record) { Contract.Requires(record.IsFileDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal AssemblyDef(MetadataRecord record) { Contract.Requires(record.IsAssemblyDef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal TypeNesting(MetadataRecord record) { Contract.Requires(record.IsTypeNesting && record.Tables.IsValidToken(record.Token)); m_record = record; }
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, " "); } } }
internal MethodSpec(MetadataRecord record) { Contract.Requires(record.IsMethodSpec && record.Tables.IsValidToken(record.Token)); m_record = record; }
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>"; } }
internal ModuleRef(MetadataRecord record) { Contract.Requires(record.IsModuleRef && record.Tables.IsValidToken(record.Token)); m_record = record; }
internal MetadataTableView(MetadataRecord parent, MetadataTokenType type) { m_type = type; m_parent = parent; }