2 Copyright (C) 2009-2011 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;
27 using System.Security;
29 using System.Diagnostics;
30 using IKVM.Reflection.Reader;
31 using IKVM.Reflection.Emit;
33 namespace IKVM.Reflection
35 public sealed class ResolveEventArgs : EventArgs
37 private readonly string name;
38 private readonly Assembly requestingAssembly;
40 public ResolveEventArgs(string name)
45 public ResolveEventArgs(string name, Assembly requestingAssembly)
48 this.requestingAssembly = requestingAssembly;
56 public Assembly RequestingAssembly
58 get { return requestingAssembly; }
62 public enum AssemblyComparisonResult
65 EquivalentFullMatch = 1,
66 EquivalentWeakNamed = 2,
67 EquivalentFXUnified = 3,
68 EquivalentUnified = 4,
69 NonEquivalentVersion = 5,
71 EquivalentPartialMatch = 7,
72 EquivalentPartialWeakNamed = 8,
73 EquivalentPartialUnified = 9,
74 EquivalentPartialFXUnified = 10,
75 NonEquivalentPartialVersion = 11,
78 public delegate Assembly ResolveEventHandler(object sender, ResolveEventArgs args);
80 public sealed class Universe : IDisposable
82 internal readonly Dictionary<Type, Type> canonicalizedTypes = new Dictionary<Type, Type>();
83 private readonly List<Assembly> assemblies = new List<Assembly>();
84 private readonly List<AssemblyBuilder> dynamicAssemblies = new List<AssemblyBuilder>();
85 private readonly Dictionary<string, Assembly> assembliesByName = new Dictionary<string, Assembly>();
86 private readonly Dictionary<System.Type, Type> importedTypes = new Dictionary<System.Type, Type>();
87 private Dictionary<ScopedTypeName, Type> missingTypes;
88 private bool resolveMissingTypes;
89 private Type typeof_System_Object;
90 private Type typeof_System_ValueType;
91 private Type typeof_System_Enum;
92 private Type typeof_System_Void;
93 private Type typeof_System_Boolean;
94 private Type typeof_System_Char;
95 private Type typeof_System_SByte;
96 private Type typeof_System_Byte;
97 private Type typeof_System_Int16;
98 private Type typeof_System_UInt16;
99 private Type typeof_System_Int32;
100 private Type typeof_System_UInt32;
101 private Type typeof_System_Int64;
102 private Type typeof_System_UInt64;
103 private Type typeof_System_Single;
104 private Type typeof_System_Double;
105 private Type typeof_System_String;
106 private Type typeof_System_IntPtr;
107 private Type typeof_System_UIntPtr;
108 private Type typeof_System_TypedReference;
109 private Type typeof_System_Type;
110 private Type typeof_System_Array;
111 private Type typeof_System_DateTime;
112 private Type typeof_System_DBNull;
113 private Type typeof_System_Decimal;
114 private Type typeof_System_NonSerializedAttribute;
115 private Type typeof_System_SerializableAttribute;
116 private Type typeof_System_AttributeUsageAttribute;
117 private Type typeof_System_Reflection_AssemblyCultureAttribute;
118 private Type typeof_System_Runtime_InteropServices_DllImportAttribute;
119 private Type typeof_System_Runtime_InteropServices_FieldOffsetAttribute;
120 private Type typeof_System_Runtime_InteropServices_InAttribute;
121 private Type typeof_System_Runtime_InteropServices_MarshalAsAttribute;
122 private Type typeof_System_Runtime_InteropServices_UnmanagedType;
123 private Type typeof_System_Runtime_InteropServices_VarEnum;
124 private Type typeof_System_Runtime_InteropServices_OutAttribute;
125 private Type typeof_System_Runtime_InteropServices_StructLayoutAttribute;
126 private Type typeof_System_Runtime_InteropServices_OptionalAttribute;
127 private Type typeof_System_Runtime_InteropServices_PreserveSigAttribute;
128 private Type typeof_System_Runtime_InteropServices_ComImportAttribute;
129 private Type typeof_System_Runtime_CompilerServices_DecimalConstantAttribute;
130 private Type typeof_System_Runtime_CompilerServices_SpecialNameAttribute;
131 private Type typeof_System_Runtime_CompilerServices_MethodImplAttribute;
132 private Type typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute;
133 private Type typeof_System_Reflection_AssemblyCopyrightAttribute;
134 private Type typeof_System_Reflection_AssemblyTrademarkAttribute;
135 private Type typeof_System_Reflection_AssemblyProductAttribute;
136 private Type typeof_System_Reflection_AssemblyCompanyAttribute;
137 private Type typeof_System_Reflection_AssemblyDescriptionAttribute;
138 private Type typeof_System_Reflection_AssemblyTitleAttribute;
139 private Type typeof_System_Reflection_AssemblyInformationalVersionAttribute;
140 private Type typeof_System_Reflection_AssemblyFileVersionAttribute;
141 private Type typeof_System_Security_Permissions_CodeAccessSecurityAttribute;
142 private Type typeof_System_Security_Permissions_HostProtectionAttribute;
143 private Type typeof_System_Security_Permissions_PermissionSetAttribute;
144 private Type typeof_System_Security_Permissions_SecurityAction;
145 private List<ResolveEventHandler> resolvers = new List<ResolveEventHandler>();
147 internal Assembly Mscorlib
149 get { return Load("mscorlib"); }
152 private Type ImportMscorlibType(System.Type type)
154 // We use FindType instead of ResolveType here, because on some versions of mscorlib some of
155 // the special types we use/support are missing and the type properties are defined to
156 // return null in that case.
157 // Note that we don't have to unescape type.Name here, because none of the names contain special characters.
158 return Mscorlib.FindType(new TypeName(type.Namespace, type.Name));
161 internal Type System_Object
163 get { return typeof_System_Object ?? (typeof_System_Object = ImportMscorlibType(typeof(System.Object))); }
166 internal Type System_ValueType
168 get { return typeof_System_ValueType ?? (typeof_System_ValueType = ImportMscorlibType(typeof(System.ValueType))); }
171 internal Type System_Enum
173 get { return typeof_System_Enum ?? (typeof_System_Enum = ImportMscorlibType(typeof(System.Enum))); }
176 internal Type System_Void
178 get { return typeof_System_Void ?? (typeof_System_Void = ImportMscorlibType(typeof(void))); }
181 internal Type System_Boolean
183 get { return typeof_System_Boolean ?? (typeof_System_Boolean = ImportMscorlibType(typeof(System.Boolean))); }
186 internal Type System_Char
188 get { return typeof_System_Char ?? (typeof_System_Char = ImportMscorlibType(typeof(System.Char))); }
191 internal Type System_SByte
193 get { return typeof_System_SByte ?? (typeof_System_SByte = ImportMscorlibType(typeof(System.SByte))); }
196 internal Type System_Byte
198 get { return typeof_System_Byte ?? (typeof_System_Byte = ImportMscorlibType(typeof(System.Byte))); }
201 internal Type System_Int16
203 get { return typeof_System_Int16 ?? (typeof_System_Int16 = ImportMscorlibType(typeof(System.Int16))); }
206 internal Type System_UInt16
208 get { return typeof_System_UInt16 ?? (typeof_System_UInt16 = ImportMscorlibType(typeof(System.UInt16))); }
211 internal Type System_Int32
213 get { return typeof_System_Int32 ?? (typeof_System_Int32 = ImportMscorlibType(typeof(System.Int32))); }
216 internal Type System_UInt32
218 get { return typeof_System_UInt32 ?? (typeof_System_UInt32 = ImportMscorlibType(typeof(System.UInt32))); }
221 internal Type System_Int64
223 get { return typeof_System_Int64 ?? (typeof_System_Int64 = ImportMscorlibType(typeof(System.Int64))); }
226 internal Type System_UInt64
228 get { return typeof_System_UInt64 ?? (typeof_System_UInt64 = ImportMscorlibType(typeof(System.UInt64))); }
231 internal Type System_Single
233 get { return typeof_System_Single ?? (typeof_System_Single = ImportMscorlibType(typeof(System.Single))); }
236 internal Type System_Double
238 get { return typeof_System_Double ?? (typeof_System_Double = ImportMscorlibType(typeof(System.Double))); }
241 internal Type System_String
243 get { return typeof_System_String ?? (typeof_System_String = ImportMscorlibType(typeof(System.String))); }
246 internal Type System_IntPtr
248 get { return typeof_System_IntPtr ?? (typeof_System_IntPtr = ImportMscorlibType(typeof(System.IntPtr))); }
251 internal Type System_UIntPtr
253 get { return typeof_System_UIntPtr ?? (typeof_System_UIntPtr = ImportMscorlibType(typeof(System.UIntPtr))); }
256 internal Type System_TypedReference
258 get { return typeof_System_TypedReference ?? (typeof_System_TypedReference = ImportMscorlibType(typeof(System.TypedReference))); }
261 internal Type System_Type
263 get { return typeof_System_Type ?? (typeof_System_Type = ImportMscorlibType(typeof(System.Type))); }
266 internal Type System_Array
268 get { return typeof_System_Array ?? (typeof_System_Array = ImportMscorlibType(typeof(System.Array))); }
271 internal Type System_DateTime
273 get { return typeof_System_DateTime ?? (typeof_System_DateTime = ImportMscorlibType(typeof(System.DateTime))); }
276 internal Type System_DBNull
278 get { return typeof_System_DBNull ?? (typeof_System_DBNull = ImportMscorlibType(typeof(System.DBNull))); }
281 internal Type System_Decimal
283 get { return typeof_System_Decimal ?? (typeof_System_Decimal = ImportMscorlibType(typeof(System.Decimal))); }
286 internal Type System_NonSerializedAttribute
288 get { return typeof_System_NonSerializedAttribute ?? (typeof_System_NonSerializedAttribute = ImportMscorlibType(typeof(System.NonSerializedAttribute))); }
291 internal Type System_SerializableAttribute
293 get { return typeof_System_SerializableAttribute ?? (typeof_System_SerializableAttribute = ImportMscorlibType(typeof(System.SerializableAttribute))); }
296 internal Type System_AttributeUsageAttribute
298 get { return typeof_System_AttributeUsageAttribute ?? (typeof_System_AttributeUsageAttribute = ImportMscorlibType(typeof(System.AttributeUsageAttribute))); }
301 internal Type System_Reflection_AssemblyCultureAttribute
303 get { return typeof_System_Reflection_AssemblyCultureAttribute ?? (typeof_System_Reflection_AssemblyCultureAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyCultureAttribute))); }
306 internal Type System_Runtime_InteropServices_DllImportAttribute
308 get { return typeof_System_Runtime_InteropServices_DllImportAttribute ?? (typeof_System_Runtime_InteropServices_DllImportAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.DllImportAttribute))); }
311 internal Type System_Runtime_InteropServices_FieldOffsetAttribute
313 get { return typeof_System_Runtime_InteropServices_FieldOffsetAttribute ?? (typeof_System_Runtime_InteropServices_FieldOffsetAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.FieldOffsetAttribute))); }
316 internal Type System_Runtime_InteropServices_InAttribute
318 get { return typeof_System_Runtime_InteropServices_InAttribute ?? (typeof_System_Runtime_InteropServices_InAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.InAttribute))); }
321 internal Type System_Runtime_InteropServices_MarshalAsAttribute
323 get { return typeof_System_Runtime_InteropServices_MarshalAsAttribute ?? (typeof_System_Runtime_InteropServices_MarshalAsAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.MarshalAsAttribute))); }
326 internal Type System_Runtime_InteropServices_UnmanagedType
328 get { return typeof_System_Runtime_InteropServices_UnmanagedType ?? (typeof_System_Runtime_InteropServices_UnmanagedType = ImportMscorlibType(typeof(System.Runtime.InteropServices.UnmanagedType))); }
331 internal Type System_Runtime_InteropServices_VarEnum
333 get { return typeof_System_Runtime_InteropServices_VarEnum ?? (typeof_System_Runtime_InteropServices_VarEnum = ImportMscorlibType(typeof(System.Runtime.InteropServices.VarEnum))); }
336 internal Type System_Runtime_InteropServices_OutAttribute
338 get { return typeof_System_Runtime_InteropServices_OutAttribute ?? (typeof_System_Runtime_InteropServices_OutAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.OutAttribute))); }
341 internal Type System_Runtime_InteropServices_StructLayoutAttribute
343 get { return typeof_System_Runtime_InteropServices_StructLayoutAttribute ?? (typeof_System_Runtime_InteropServices_StructLayoutAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.StructLayoutAttribute))); }
346 internal Type System_Runtime_InteropServices_OptionalAttribute
348 get { return typeof_System_Runtime_InteropServices_OptionalAttribute ?? (typeof_System_Runtime_InteropServices_OptionalAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.OptionalAttribute))); }
351 internal Type System_Runtime_InteropServices_PreserveSigAttribute
353 get { return typeof_System_Runtime_InteropServices_PreserveSigAttribute ?? (typeof_System_Runtime_InteropServices_PreserveSigAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.PreserveSigAttribute))); }
356 internal Type System_Runtime_InteropServices_ComImportAttribute
358 get { return typeof_System_Runtime_InteropServices_ComImportAttribute ?? (typeof_System_Runtime_InteropServices_ComImportAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.ComImportAttribute))); }
361 internal Type System_Runtime_CompilerServices_DecimalConstantAttribute
363 get { return typeof_System_Runtime_CompilerServices_DecimalConstantAttribute ?? (typeof_System_Runtime_CompilerServices_DecimalConstantAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.DecimalConstantAttribute))); }
366 internal Type System_Runtime_CompilerServices_SpecialNameAttribute
368 get { return typeof_System_Runtime_CompilerServices_SpecialNameAttribute ?? (typeof_System_Runtime_CompilerServices_SpecialNameAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.SpecialNameAttribute))); }
371 internal Type System_Runtime_CompilerServices_MethodImplAttribute
373 get { return typeof_System_Runtime_CompilerServices_MethodImplAttribute ?? (typeof_System_Runtime_CompilerServices_MethodImplAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.MethodImplAttribute))); }
376 internal Type System_Security_SuppressUnmanagedCodeSecurityAttribute
378 get { return typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute ?? (typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute = ImportMscorlibType(typeof(System.Security.SuppressUnmanagedCodeSecurityAttribute))); }
381 internal Type System_Reflection_AssemblyCopyrightAttribute
383 get { return typeof_System_Reflection_AssemblyCopyrightAttribute ?? (typeof_System_Reflection_AssemblyCopyrightAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyCopyrightAttribute))); }
386 internal Type System_Reflection_AssemblyTrademarkAttribute
388 get { return typeof_System_Reflection_AssemblyTrademarkAttribute ?? (typeof_System_Reflection_AssemblyTrademarkAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyTrademarkAttribute))); }
391 internal Type System_Reflection_AssemblyProductAttribute
393 get { return typeof_System_Reflection_AssemblyProductAttribute ?? (typeof_System_Reflection_AssemblyProductAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyProductAttribute))); }
396 internal Type System_Reflection_AssemblyCompanyAttribute
398 get { return typeof_System_Reflection_AssemblyCompanyAttribute ?? (typeof_System_Reflection_AssemblyCompanyAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyCompanyAttribute))); }
401 internal Type System_Reflection_AssemblyDescriptionAttribute
403 get { return typeof_System_Reflection_AssemblyDescriptionAttribute ?? (typeof_System_Reflection_AssemblyDescriptionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyDescriptionAttribute))); }
406 internal Type System_Reflection_AssemblyTitleAttribute
408 get { return typeof_System_Reflection_AssemblyTitleAttribute ?? (typeof_System_Reflection_AssemblyTitleAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyTitleAttribute))); }
411 internal Type System_Reflection_AssemblyInformationalVersionAttribute
413 get { return typeof_System_Reflection_AssemblyInformationalVersionAttribute ?? (typeof_System_Reflection_AssemblyInformationalVersionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyInformationalVersionAttribute))); }
416 internal Type System_Reflection_AssemblyFileVersionAttribute
418 get { return typeof_System_Reflection_AssemblyFileVersionAttribute ?? (typeof_System_Reflection_AssemblyFileVersionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyFileVersionAttribute))); }
421 internal Type System_Security_Permissions_CodeAccessSecurityAttribute
423 get { return typeof_System_Security_Permissions_CodeAccessSecurityAttribute ?? (typeof_System_Security_Permissions_CodeAccessSecurityAttribute = ImportMscorlibType(typeof(System.Security.Permissions.CodeAccessSecurityAttribute))); }
426 internal Type System_Security_Permissions_HostProtectionAttribute
428 get { return typeof_System_Security_Permissions_HostProtectionAttribute ?? (typeof_System_Security_Permissions_HostProtectionAttribute = ImportMscorlibType(typeof(System.Security.Permissions.HostProtectionAttribute))); }
431 internal Type System_Security_Permissions_PermissionSetAttribute
433 get { return typeof_System_Security_Permissions_PermissionSetAttribute ?? (typeof_System_Security_Permissions_PermissionSetAttribute = ImportMscorlibType(typeof(System.Security.Permissions.PermissionSetAttribute))); }
436 internal Type System_Security_Permissions_SecurityAction
438 get { return typeof_System_Security_Permissions_SecurityAction ?? (typeof_System_Security_Permissions_SecurityAction = ImportMscorlibType(typeof(System.Security.Permissions.SecurityAction))); }
441 internal bool HasMscorlib
443 get { return GetLoadedAssembly("mscorlib") != null; }
446 public event ResolveEventHandler AssemblyResolve
448 add { resolvers.Add(value); }
449 remove { resolvers.Remove(value); }
452 public Type Import(System.Type type)
455 if (!importedTypes.TryGetValue(type, out imported))
457 imported = ImportImpl(type);
458 if (imported != null)
460 importedTypes.Add(type, imported);
466 private Type ImportImpl(System.Type type)
468 if (type.Assembly == typeof(IKVM.Reflection.Type).Assembly)
470 throw new ArgumentException("Did you really want to import " + type.FullName + "?");
472 if (type.HasElementType)
476 if (type.Name.EndsWith("[]"))
478 return Import(type.GetElementType()).MakeArrayType();
482 return Import(type.GetElementType()).MakeArrayType(type.GetArrayRank());
485 else if (type.IsByRef)
487 return Import(type.GetElementType()).MakeByRefType();
489 else if (type.IsPointer)
491 return Import(type.GetElementType()).MakePointerType();
495 throw new InvalidOperationException();
498 else if (type.IsGenericParameter)
500 if (type.DeclaringMethod != null)
502 throw new NotImplementedException();
506 return Import(type.DeclaringType).GetGenericArguments()[type.GenericParameterPosition];
509 else if (type.IsGenericType && !type.IsGenericTypeDefinition)
511 System.Type[] args = type.GetGenericArguments();
512 Type[] importedArgs = new Type[args.Length];
513 for (int i = 0; i < args.Length; i++)
515 importedArgs[i] = Import(args[i]);
517 return Import(type.GetGenericTypeDefinition()).MakeGenericType(importedArgs);
521 return Import(type.Assembly).GetType(type.FullName);
525 private Assembly Import(System.Reflection.Assembly asm)
527 return Load(asm.FullName);
530 public RawModule OpenRawModule(string path)
532 path = Path.GetFullPath(path);
533 return OpenRawModule(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read), path);
536 public RawModule OpenRawModule(Stream stream, string location)
538 if (!stream.CanRead || !stream.CanSeek || stream.Position != 0)
540 throw new ArgumentException("Stream must support read/seek and current position must be zero.", "stream");
542 return new RawModule(new ModuleReader(null, this, stream, location));
545 public Assembly LoadAssembly(RawModule module)
547 string refname = module.GetAssemblyName().FullName;
548 Assembly asm = GetLoadedAssembly(refname);
551 asm = module.ToAssembly();
557 public Assembly LoadFile(string path)
561 using (RawModule module = OpenRawModule(path))
563 return LoadAssembly(module);
566 catch (IOException x)
568 throw new FileNotFoundException(x.Message, x);
570 catch (UnauthorizedAccessException x)
572 throw new FileNotFoundException(x.Message, x);
576 private Assembly GetLoadedAssembly(string refname)
579 if (!assembliesByName.TryGetValue(refname, out asm))
581 for (int i = 0; i < assemblies.Count; i++)
583 AssemblyComparisonResult result;
584 // We won't allow FX unification here, because our own (non-Fusion) implementation of CompareAssemblyIdentity doesn't support it and
585 // we don't want to create a fundamental functional difference based on that.
586 if (CompareAssemblyIdentity(refname, false, assemblies[i].FullName, false, out result) && result != AssemblyComparisonResult.EquivalentFXUnified)
589 assembliesByName.Add(refname, asm);
597 private Assembly GetDynamicAssembly(string refname)
599 foreach (AssemblyBuilder asm in dynamicAssemblies)
601 AssemblyComparisonResult result;
602 // We won't allow FX unification here, because our own (non-Fusion) implementation of CompareAssemblyIdentity doesn't support it and
603 // we don't want to create a fundamental functional difference based on that.
604 if (CompareAssemblyIdentity(refname, false, asm.FullName, false, out result) && result != AssemblyComparisonResult.EquivalentFXUnified)
612 public Assembly Load(string refname)
614 return Load(refname, null, true);
617 internal Assembly Load(string refname, Assembly requestingAssembly, bool throwOnError)
619 Assembly asm = GetLoadedAssembly(refname);
624 if (resolvers.Count == 0)
626 asm = DefaultResolver(refname, throwOnError);
630 ResolveEventArgs args = new ResolveEventArgs(refname, requestingAssembly);
631 foreach (ResolveEventHandler evt in resolvers)
633 asm = evt(this, args);
641 asm = GetDynamicAssembly(refname);
646 string defname = asm.FullName;
647 if (refname != defname)
649 assembliesByName.Add(refname, asm);
655 throw new FileNotFoundException(refname);
660 private Assembly DefaultResolver(string refname, bool throwOnError)
662 Assembly asm = GetDynamicAssembly(refname);
672 fileName = System.Reflection.Assembly.ReflectionOnlyLoad(refname).Location;
674 catch (System.BadImageFormatException x)
676 throw new BadImageFormatException(x.Message, x);
683 fileName = System.Reflection.Assembly.ReflectionOnlyLoad(refname).Location;
685 catch (System.BadImageFormatException x)
687 throw new BadImageFormatException(x.Message, x);
689 catch (FileNotFoundException)
691 // we intentionally only swallow the FileNotFoundException, if the file exists but isn't a valid assembly,
692 // we should throw an exception
696 return LoadFile(fileName);
699 public Type GetType(string assemblyQualifiedTypeName)
701 // to be more compatible with Type.GetType(), we could call Assembly.GetCallingAssembly(),
702 // import that assembly and pass it as the context, but implicitly importing is considered evil
703 return GetType(null, assemblyQualifiedTypeName, false);
706 public Type GetType(string assemblyQualifiedTypeName, bool throwOnError)
708 // to be more compatible with Type.GetType(), we could call Assembly.GetCallingAssembly(),
709 // import that assembly and pass it as the context, but implicitly importing is considered evil
710 return GetType(null, assemblyQualifiedTypeName, throwOnError);
713 // note that context is slightly different from the calling assembly (System.Type.GetType),
714 // because context is passed to the AssemblyResolve event as the RequestingAssembly
715 public Type GetType(Assembly context, string assemblyQualifiedTypeName, bool throwOnError)
717 TypeNameParser parser = TypeNameParser.Parse(assemblyQualifiedTypeName, throwOnError);
722 return parser.GetType(this, context, throwOnError, assemblyQualifiedTypeName);
725 public Assembly[] GetAssemblies()
727 Assembly[] array = new Assembly[assemblies.Count + dynamicAssemblies.Count];
728 assemblies.CopyTo(array);
729 for (int i = 0, j = assemblies.Count; j < array.Length; i++, j++)
731 array[j] = dynamicAssemblies[i];
736 // this is equivalent to the Fusion CompareAssemblyIdentity API
737 public bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
739 return Fusion.CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result);
742 public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access)
744 return DefineDynamicAssemblyImpl(name, access, null, null, null, null);
747 public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, string dir)
749 return DefineDynamicAssemblyImpl(name, access, dir, null, null, null);
755 public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, string dir, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet refusedPermissions)
757 return DefineDynamicAssemblyImpl(name, access, dir, requiredPermissions, optionalPermissions, refusedPermissions);
760 private AssemblyBuilder DefineDynamicAssemblyImpl(AssemblyName name, AssemblyBuilderAccess access, string dir, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet refusedPermissions)
762 AssemblyBuilder asm = new AssemblyBuilder(this, name, dir, requiredPermissions, optionalPermissions, refusedPermissions);
763 dynamicAssemblies.Add(asm);
767 internal void RenameAssembly(Assembly assembly, AssemblyName oldName)
769 List<string> remove = new List<string>();
770 foreach (KeyValuePair<string, Assembly> kv in assembliesByName)
772 if (kv.Value == assembly)
777 foreach (string key in remove)
779 assembliesByName.Remove(key);
783 public void Dispose()
785 foreach (Assembly asm in assemblies)
787 foreach (Module mod in asm.GetLoadedModules())
792 foreach (AssemblyBuilder asm in dynamicAssemblies)
794 foreach (Module mod in asm.GetLoadedModules())
801 public Assembly CreateMissingAssembly(string assemblyName)
803 return new MissingAssembly(this, assemblyName);
806 public void EnableMissingTypeResolution()
808 resolveMissingTypes = true;
811 private struct ScopedTypeName : IEquatable<ScopedTypeName>
813 private readonly object scope;
814 private readonly TypeName name;
816 internal ScopedTypeName(object scope, TypeName name)
822 public override bool Equals(object obj)
824 ScopedTypeName? other = obj as ScopedTypeName?;
825 return other != null && ((IEquatable<ScopedTypeName>)other.Value).Equals(this);
828 public override int GetHashCode()
830 return scope.GetHashCode() * 7 + name.GetHashCode();
833 bool IEquatable<ScopedTypeName>.Equals(ScopedTypeName other)
835 return other.scope == scope && other.name == name;
839 internal Type GetMissingType(Module module, Type declaringType, TypeName typeName)
841 if (resolveMissingTypes || module.Assembly.__IsMissing)
843 if (missingTypes == null)
845 missingTypes = new Dictionary<ScopedTypeName, Type>();
847 ScopedTypeName stn = new ScopedTypeName(declaringType ?? (object)module, typeName);
849 if (!missingTypes.TryGetValue(stn, out type))
851 type = new MissingType(module, declaringType, typeName.Namespace, typeName.Name);
852 missingTypes.Add(stn, type);