2 Copyright (C) 2009-2012 Jeroen Frijters
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely, subject to the following restrictions:
12 1. The origin of this software must not be misrepresented; you must not
13 claim that you wrote the original software. If you use this software
14 in a product, an acknowledgment in the product documentation would be
15 appreciated but is not required.
16 2. Altered source versions must be plainly marked as such, and must not be
17 misrepresented as being the original software.
18 3. This notice may not be removed or altered from any source distribution.
25 using System.Collections.Generic;
26 using IKVM.Reflection.Metadata;
27 using IKVM.Reflection.Reader;
29 namespace IKVM.Reflection
31 public sealed class RawModule : IDisposable
33 private readonly ModuleReader module;
34 private readonly bool isManifestModule;
35 private bool imported;
37 internal RawModule(ModuleReader module)
40 this.isManifestModule = module.Assembly != null;
43 public string Location
45 get { return module.FullyQualifiedName; }
48 public bool IsManifestModule
50 get { return isManifestModule; }
53 public Guid ModuleVersionId
55 get { return module.ModuleVersionId; }
58 private void CheckManifestModule()
60 if (!IsManifestModule)
62 throw new BadImageFormatException("Module does not contain a manifest");
66 public AssemblyName GetAssemblyName()
68 CheckManifestModule();
69 return module.Assembly.GetName();
72 public AssemblyName[] GetReferencedAssemblies()
74 return module.__GetReferencedAssemblies();
81 module.stream.Dispose();
85 internal AssemblyReader ToAssembly()
89 throw new InvalidOperationException();
92 return (AssemblyReader)module.Assembly;
95 internal Module ToModule(Assembly assembly)
97 if (module.Assembly != null)
99 throw new InvalidOperationException();
102 module.SetAssembly(assembly);
107 public abstract class Module : ICustomAttributeProvider
109 internal readonly Universe universe;
110 internal readonly ModuleTable ModuleTable = new ModuleTable();
111 internal readonly TypeRefTable TypeRef = new TypeRefTable();
112 internal readonly TypeDefTable TypeDef = new TypeDefTable();
113 internal readonly FieldPtrTable FieldPtr = new FieldPtrTable();
114 internal readonly FieldTable Field = new FieldTable();
115 internal readonly MemberRefTable MemberRef = new MemberRefTable();
116 internal readonly ConstantTable Constant = new ConstantTable();
117 internal readonly CustomAttributeTable CustomAttribute = new CustomAttributeTable();
118 internal readonly FieldMarshalTable FieldMarshal = new FieldMarshalTable();
119 internal readonly DeclSecurityTable DeclSecurity = new DeclSecurityTable();
120 internal readonly ClassLayoutTable ClassLayout = new ClassLayoutTable();
121 internal readonly FieldLayoutTable FieldLayout = new FieldLayoutTable();
122 internal readonly ParamPtrTable ParamPtr = new ParamPtrTable();
123 internal readonly ParamTable Param = new ParamTable();
124 internal readonly InterfaceImplTable InterfaceImpl = new InterfaceImplTable();
125 internal readonly StandAloneSigTable StandAloneSig = new StandAloneSigTable();
126 internal readonly EventMapTable EventMap = new EventMapTable();
127 internal readonly EventPtrTable EventPtr = new EventPtrTable();
128 internal readonly EventTable Event = new EventTable();
129 internal readonly PropertyMapTable PropertyMap = new PropertyMapTable();
130 internal readonly PropertyPtrTable PropertyPtr = new PropertyPtrTable();
131 internal readonly PropertyTable Property = new PropertyTable();
132 internal readonly MethodSemanticsTable MethodSemantics = new MethodSemanticsTable();
133 internal readonly MethodImplTable MethodImpl = new MethodImplTable();
134 internal readonly ModuleRefTable ModuleRef = new ModuleRefTable();
135 internal readonly TypeSpecTable TypeSpec = new TypeSpecTable();
136 internal readonly ImplMapTable ImplMap = new ImplMapTable();
137 internal readonly FieldRVATable FieldRVA = new FieldRVATable();
138 internal readonly AssemblyTable AssemblyTable = new AssemblyTable();
139 internal readonly AssemblyRefTable AssemblyRef = new AssemblyRefTable();
140 internal readonly MethodPtrTable MethodPtr = new MethodPtrTable();
141 internal readonly MethodDefTable MethodDef = new MethodDefTable();
142 internal readonly NestedClassTable NestedClass = new NestedClassTable();
143 internal readonly FileTable File = new FileTable();
144 internal readonly ExportedTypeTable ExportedType = new ExportedTypeTable();
145 internal readonly ManifestResourceTable ManifestResource = new ManifestResourceTable();
146 internal readonly GenericParamTable GenericParam = new GenericParamTable();
147 internal readonly MethodSpecTable MethodSpec = new MethodSpecTable();
148 internal readonly GenericParamConstraintTable GenericParamConstraint = new GenericParamConstraintTable();
150 protected Module(Universe universe)
152 this.universe = universe;
155 internal Table[] GetTables()
157 Table[] tables = new Table[64];
158 tables[ModuleTable.Index] = ModuleTable;
159 tables[TypeRefTable.Index] = TypeRef;
160 tables[TypeDefTable.Index] = TypeDef;
161 tables[FieldPtrTable.Index] = FieldPtr;
162 tables[FieldTable.Index] = Field;
163 tables[MemberRefTable.Index] = MemberRef;
164 tables[ConstantTable.Index] = Constant;
165 tables[CustomAttributeTable.Index] = CustomAttribute;
166 tables[FieldMarshalTable.Index] = FieldMarshal;
167 tables[DeclSecurityTable.Index] = DeclSecurity;
168 tables[ClassLayoutTable.Index] = ClassLayout;
169 tables[FieldLayoutTable.Index] = FieldLayout;
170 tables[ParamPtrTable.Index] = ParamPtr;
171 tables[ParamTable.Index] = Param;
172 tables[InterfaceImplTable.Index] = InterfaceImpl;
173 tables[StandAloneSigTable.Index] = StandAloneSig;
174 tables[EventMapTable.Index] = EventMap;
175 tables[EventPtrTable.Index] = EventPtr;
176 tables[EventTable.Index] = Event;
177 tables[PropertyMapTable.Index] = PropertyMap;
178 tables[PropertyPtrTable.Index] = PropertyPtr;
179 tables[PropertyTable.Index] = Property;
180 tables[MethodSemanticsTable.Index] = MethodSemantics;
181 tables[MethodImplTable.Index] = MethodImpl;
182 tables[ModuleRefTable.Index] = ModuleRef;
183 tables[TypeSpecTable.Index] = TypeSpec;
184 tables[ImplMapTable.Index] = ImplMap;
185 tables[FieldRVATable.Index] = FieldRVA;
186 tables[AssemblyTable.Index] = AssemblyTable;
187 tables[AssemblyRefTable.Index] = AssemblyRef;
188 tables[MethodPtrTable.Index] = MethodPtr;
189 tables[MethodDefTable.Index] = MethodDef;
190 tables[NestedClassTable.Index] = NestedClass;
191 tables[FileTable.Index] = File;
192 tables[ExportedTypeTable.Index] = ExportedType;
193 tables[ManifestResourceTable.Index] = ManifestResource;
194 tables[GenericParamTable.Index] = GenericParam;
195 tables[MethodSpecTable.Index] = MethodSpec;
196 tables[GenericParamConstraintTable.Index] = GenericParamConstraint;
200 public virtual void __GetDataDirectoryEntry(int index, out int rva, out int length)
202 throw new NotSupportedException();
205 public virtual long __RelativeVirtualAddressToFileOffset(int rva)
207 throw new NotSupportedException();
210 public virtual bool __GetSectionInfo(int rva, out string name, out int characteristics)
212 throw new NotSupportedException();
215 public virtual int __ReadDataFromRVA(int rva, byte[] data, int offset, int length)
217 throw new NotSupportedException();
220 public virtual void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine)
222 throw new NotSupportedException();
225 public virtual int __Subsystem
227 get { throw new NotSupportedException(); }
230 public FieldInfo GetField(string name)
232 return GetField(name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
235 public FieldInfo GetField(string name, BindingFlags bindingFlags)
237 return IsResource() ? null : GetModuleType().GetField(name, bindingFlags | BindingFlags.DeclaredOnly);
240 public FieldInfo[] GetFields()
242 return GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
245 public FieldInfo[] GetFields(BindingFlags bindingFlags)
247 return IsResource() ? Empty<FieldInfo>.Array : GetModuleType().GetFields(bindingFlags | BindingFlags.DeclaredOnly);
250 public MethodInfo GetMethod(string name)
252 return IsResource() ? null : GetModuleType().GetMethod(name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
255 public MethodInfo GetMethod(string name, Type[] types)
257 return IsResource() ? null : GetModuleType().GetMethod(name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, types, null);
260 public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConv, Type[] types, ParameterModifier[] modifiers)
262 return IsResource() ? null : GetModuleType().GetMethod(name, bindingAttr | BindingFlags.DeclaredOnly, binder, callConv, types, modifiers);
265 public MethodInfo[] GetMethods()
267 return GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
270 public MethodInfo[] GetMethods(BindingFlags bindingFlags)
272 return IsResource() ? Empty<MethodInfo>.Array : GetModuleType().GetMethods(bindingFlags | BindingFlags.DeclaredOnly);
275 public ConstructorInfo __ModuleInitializer
277 get { return IsResource() ? null : GetModuleType().TypeInitializer; }
280 public virtual byte[] ResolveSignature(int metadataToken)
282 throw new NotSupportedException();
285 public virtual __StandAloneMethodSig __ResolveStandAloneMethodSig(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
287 throw new NotSupportedException();
290 public int MetadataToken
292 get { return IsResource() ? 0 : 1; }
295 public abstract int MDStreamVersion { get ;}
296 public abstract Assembly Assembly { get; }
297 public abstract string FullyQualifiedName { get; }
298 public abstract string Name { get; }
299 public abstract Guid ModuleVersionId { get; }
300 public abstract MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments);
301 public abstract FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments);
302 public abstract MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments);
304 public abstract string ResolveString(int metadataToken);
305 public abstract Type[] __ResolveOptionalParameterTypes(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments, out CustomModifiers[] customModifiers);
306 public abstract string ScopeName { get; }
308 internal abstract void GetTypesImpl(List<Type> list);
310 internal abstract Type FindType(TypeName name);
311 internal abstract Type FindTypeIgnoreCase(TypeName lowerCaseName);
313 [Obsolete("Please use __ResolveOptionalParameterTypes(int, Type[], Type[], out CustomModifiers[]) instead.")]
314 public Type[] __ResolveOptionalParameterTypes(int metadataToken)
316 CustomModifiers[] dummy;
317 return __ResolveOptionalParameterTypes(metadataToken, null, null, out dummy);
320 public Type GetType(string className)
322 return GetType(className, false, false);
325 public Type GetType(string className, bool ignoreCase)
327 return GetType(className, false, ignoreCase);
330 public Type GetType(string className, bool throwOnError, bool ignoreCase)
332 TypeNameParser parser = TypeNameParser.Parse(className, throwOnError);
337 if (parser.AssemblyName != null)
341 throw new ArgumentException("Type names passed to Module.GetType() must not specify an assembly.");
348 TypeName typeName = TypeName.Split(TypeNameParser.Unescape(parser.FirstNamePart));
349 Type type = ignoreCase
350 ? FindTypeIgnoreCase(typeName.ToLowerInvariant())
351 : FindType(typeName);
352 if (type == null && __IsMissing)
354 throw new MissingModuleException((MissingModule)this);
356 return parser.Expand(type, this.Assembly, throwOnError, className, false, ignoreCase);
359 public Type[] GetTypes()
361 List<Type> list = new List<Type>();
363 return list.ToArray();
366 public Type[] FindTypes(TypeFilter filter, object filterCriteria)
368 List<Type> list = new List<Type>();
369 foreach (Type type in GetTypes())
371 if (filter(type, filterCriteria))
376 return list.ToArray();
379 public virtual bool IsResource()
384 public Type ResolveType(int metadataToken)
386 return ResolveType(metadataToken, null, null);
389 internal sealed class GenericContext : IGenericContext
391 private readonly Type[] genericTypeArguments;
392 private readonly Type[] genericMethodArguments;
394 internal GenericContext(Type[] genericTypeArguments, Type[] genericMethodArguments)
396 this.genericTypeArguments = genericTypeArguments;
397 this.genericMethodArguments = genericMethodArguments;
400 public Type GetGenericTypeArgument(int index)
402 return genericTypeArguments[index];
405 public Type GetGenericMethodArgument(int index)
407 return genericMethodArguments[index];
411 public Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
413 if ((metadataToken >> 24) == TypeSpecTable.Index)
415 return ResolveType(metadataToken, new GenericContext(genericTypeArguments, genericMethodArguments));
419 return ResolveType(metadataToken, null);
423 internal abstract Type ResolveType(int metadataToken, IGenericContext context);
425 public MethodBase ResolveMethod(int metadataToken)
427 return ResolveMethod(metadataToken, null, null);
430 public FieldInfo ResolveField(int metadataToken)
432 return ResolveField(metadataToken, null, null);
435 public MemberInfo ResolveMember(int metadataToken)
437 return ResolveMember(metadataToken, null, null);
440 public bool IsDefined(Type attributeType, bool inherit)
442 return CustomAttributeData.__GetCustomAttributes(this, attributeType, inherit).Count != 0;
445 public IList<CustomAttributeData> __GetCustomAttributes(Type attributeType, bool inherit)
447 return CustomAttributeData.__GetCustomAttributes(this, attributeType, inherit);
450 public virtual IList<CustomAttributeData> __GetPlaceholderAssemblyCustomAttributes(bool multiple, bool security)
452 return Empty<CustomAttributeData>.Array;
455 public abstract AssemblyName[] __GetReferencedAssemblies();
457 public virtual void __ResolveReferencedAssemblies(Assembly[] assemblies)
459 throw new NotSupportedException();
462 public abstract string[] __GetReferencedModules();
464 public abstract Type[] __GetReferencedTypes();
466 public abstract Type[] __GetExportedTypes();
468 public virtual bool __IsMissing
470 get { return false; }
473 public long __ImageBase
475 get { return GetImageBaseImpl(); }
478 protected abstract long GetImageBaseImpl();
480 public long __StackReserve
482 get { return GetStackReserveImpl(); }
485 protected abstract long GetStackReserveImpl();
487 public int __FileAlignment
489 get { return GetFileAlignmentImpl(); }
492 protected abstract int GetFileAlignmentImpl();
494 public DllCharacteristics __DllCharacteristics
496 get { return GetDllCharacteristicsImpl(); }
499 protected abstract DllCharacteristics GetDllCharacteristicsImpl();
501 public virtual byte[] __ModuleHash
503 get { throw new NotSupportedException(); }
506 public virtual int __EntryPointRVA
508 get { throw new NotSupportedException(); }
511 public virtual int __EntryPointToken
513 get { throw new NotSupportedException(); }
516 public virtual string __ImageRuntimeVersion
518 get { throw new NotSupportedException(); }
521 public IEnumerable<CustomAttributeData> __EnumerateCustomAttributeTable()
523 List<CustomAttributeData> list = new List<CustomAttributeData>(CustomAttribute.RowCount);
524 for (int i = 0; i < CustomAttribute.RowCount; i++)
526 list.Add(new CustomAttributeData(this, i));
532 public List<CustomAttributeData> __GetCustomAttributesFor(int token)
534 return CustomAttributeData.GetCustomAttributesImpl(new List<CustomAttributeData>(), this, token, null);
537 internal abstract Type GetModuleType();
539 internal abstract ByteReader GetBlob(int blobIndex);
541 internal IList<CustomAttributeData> GetDeclarativeSecurity(int metadataToken)
543 List<CustomAttributeData> list = new List<CustomAttributeData>();
544 foreach (int i in DeclSecurity.Filter(metadataToken))
546 CustomAttributeData.ReadDeclarativeSecurity(this, i, list);
551 internal virtual void Dispose()
555 internal virtual void ExportTypes(int fileToken, IKVM.Reflection.Emit.ModuleBuilder manifestModule)
559 internal virtual string GetString(int index)
561 throw new NotSupportedException();
565 abstract class NonPEModule : Module
567 protected NonPEModule(Universe universe)
572 protected virtual Exception InvalidOperationException()
574 return new InvalidOperationException();
577 protected virtual Exception NotSupportedException()
579 return new NotSupportedException();
582 protected virtual Exception ArgumentOutOfRangeException()
584 return new ArgumentOutOfRangeException();
587 internal sealed override Type GetModuleType()
589 throw InvalidOperationException();
592 internal sealed override ByteReader GetBlob(int blobIndex)
594 throw InvalidOperationException();
597 public sealed override AssemblyName[] __GetReferencedAssemblies()
599 throw NotSupportedException();
602 public sealed override string[] __GetReferencedModules()
604 throw NotSupportedException();
607 public override Type[] __GetReferencedTypes()
609 throw NotSupportedException();
612 public override Type[] __GetExportedTypes()
614 throw NotSupportedException();
617 protected sealed override long GetImageBaseImpl()
619 throw NotSupportedException();
622 protected sealed override long GetStackReserveImpl()
624 throw NotSupportedException();
627 protected sealed override int GetFileAlignmentImpl()
629 throw NotSupportedException();
632 protected override DllCharacteristics GetDllCharacteristicsImpl()
634 throw NotSupportedException();
637 internal sealed override Type ResolveType(int metadataToken, IGenericContext context)
639 throw ArgumentOutOfRangeException();
642 public sealed override MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
644 throw ArgumentOutOfRangeException();
647 public sealed override FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
649 throw ArgumentOutOfRangeException();
652 public sealed override MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
654 throw ArgumentOutOfRangeException();
657 public sealed override string ResolveString(int metadataToken)
659 throw ArgumentOutOfRangeException();
662 public sealed override Type[] __ResolveOptionalParameterTypes(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments, out CustomModifiers[] customModifiers)
664 throw ArgumentOutOfRangeException();
668 public delegate bool TypeFilter(Type m, object filterCriteria);
669 public delegate bool MemberFilter(MemberInfo m, object filterCriteria);