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 IList<CustomAttributeData> GetCustomAttributesData()
452
return CustomAttributeData.GetCustomAttributes(this);
455
public IEnumerable<CustomAttributeData> CustomAttributes
457
get { return GetCustomAttributesData(); }
460
public virtual IList<CustomAttributeData> __GetPlaceholderAssemblyCustomAttributes(bool multiple, bool security)
462
return Empty<CustomAttributeData>.Array;
465
public abstract AssemblyName[] __GetReferencedAssemblies();
467
public virtual void __ResolveReferencedAssemblies(Assembly[] assemblies)
469
throw new NotSupportedException();
472
public abstract string[] __GetReferencedModules();
474
public abstract Type[] __GetReferencedTypes();
476
public abstract Type[] __GetExportedTypes();
478
public virtual bool __IsMissing
480
get { return false; }
483
public long __ImageBase
485
get { return GetImageBaseImpl(); }
488
protected abstract long GetImageBaseImpl();
490
public long __StackReserve
492
get { return GetStackReserveImpl(); }
495
protected abstract long GetStackReserveImpl();
497
public int __FileAlignment
499
get { return GetFileAlignmentImpl(); }
502
protected abstract int GetFileAlignmentImpl();
504
public DllCharacteristics __DllCharacteristics
506
get { return GetDllCharacteristicsImpl(); }
509
protected abstract DllCharacteristics GetDllCharacteristicsImpl();
511
public virtual byte[] __ModuleHash
513
get { throw new NotSupportedException(); }
516
public virtual int __EntryPointRVA
518
get { throw new NotSupportedException(); }
521
public virtual int __EntryPointToken
523
get { throw new NotSupportedException(); }
526
public virtual string __ImageRuntimeVersion
528
get { throw new NotSupportedException(); }
531
public IEnumerable<CustomAttributeData> __EnumerateCustomAttributeTable()
533
List<CustomAttributeData> list = new List<CustomAttributeData>(CustomAttribute.RowCount);
534
for (int i = 0; i < CustomAttribute.RowCount; i++)
536
list.Add(new CustomAttributeData(this, i));
542
public List<CustomAttributeData> __GetCustomAttributesFor(int token)
544
return CustomAttributeData.GetCustomAttributesImpl(new List<CustomAttributeData>(), this, token, null);
548
public virtual System.Security.Cryptography.X509Certificates.X509Certificate GetSignerCertificate()
552
#endif // !NO_AUTHENTICODE
554
internal abstract Type GetModuleType();
556
internal abstract ByteReader GetBlob(int blobIndex);
558
internal IList<CustomAttributeData> GetDeclarativeSecurity(int metadataToken)
560
List<CustomAttributeData> list = new List<CustomAttributeData>();
561
foreach (int i in DeclSecurity.Filter(metadataToken))
563
CustomAttributeData.ReadDeclarativeSecurity(this, i, list);
568
internal virtual void Dispose()
572
internal virtual void ExportTypes(int fileToken, IKVM.Reflection.Emit.ModuleBuilder manifestModule)
576
internal virtual string GetString(int index)
578
throw new NotSupportedException();
582
abstract class NonPEModule : Module
584
protected NonPEModule(Universe universe)
589
protected virtual Exception InvalidOperationException()
591
return new InvalidOperationException();
594
protected virtual Exception NotSupportedException()
596
return new NotSupportedException();
599
protected virtual Exception ArgumentOutOfRangeException()
601
return new ArgumentOutOfRangeException();
604
internal sealed override Type GetModuleType()
606
throw InvalidOperationException();
609
internal sealed override ByteReader GetBlob(int blobIndex)
611
throw InvalidOperationException();
614
public sealed override AssemblyName[] __GetReferencedAssemblies()
616
throw NotSupportedException();
619
public sealed override string[] __GetReferencedModules()
621
throw NotSupportedException();
624
public override Type[] __GetReferencedTypes()
626
throw NotSupportedException();
629
public override Type[] __GetExportedTypes()
631
throw NotSupportedException();
634
protected sealed override long GetImageBaseImpl()
636
throw NotSupportedException();
639
protected sealed override long GetStackReserveImpl()
641
throw NotSupportedException();
644
protected sealed override int GetFileAlignmentImpl()
646
throw NotSupportedException();
649
protected override DllCharacteristics GetDllCharacteristicsImpl()
651
throw NotSupportedException();
654
internal sealed override Type ResolveType(int metadataToken, IGenericContext context)
656
throw ArgumentOutOfRangeException();
659
public sealed override MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
661
throw ArgumentOutOfRangeException();
664
public sealed override FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
666
throw ArgumentOutOfRangeException();
669
public sealed override MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
671
throw ArgumentOutOfRangeException();
674
public sealed override string ResolveString(int metadataToken)
676
throw ArgumentOutOfRangeException();
679
public sealed override Type[] __ResolveOptionalParameterTypes(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments, out CustomModifiers[] customModifiers)
681
throw ArgumentOutOfRangeException();
685
public delegate bool TypeFilter(Type m, object filterCriteria);
686
public delegate bool MemberFilter(MemberInfo m, object filterCriteria);