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 Type typeof_System_Object;
88 private Type typeof_System_ValueType;
89 private Type typeof_System_Enum;
90 private Type typeof_System_Void;
91 private Type typeof_System_Boolean;
92 private Type typeof_System_Char;
93 private Type typeof_System_SByte;
94 private Type typeof_System_Byte;
95 private Type typeof_System_Int16;
96 private Type typeof_System_UInt16;
97 private Type typeof_System_Int32;
98 private Type typeof_System_UInt32;
99 private Type typeof_System_Int64;
100 private Type typeof_System_UInt64;
101 private Type typeof_System_Single;
102 private Type typeof_System_Double;
103 private Type typeof_System_String;
104 private Type typeof_System_IntPtr;
105 private Type typeof_System_UIntPtr;
106 private Type typeof_System_TypedReference;
107 private Type typeof_System_Type;
108 private Type typeof_System_Array;
109 private Type typeof_System_DateTime;
110 private Type typeof_System_DBNull;
111 private Type typeof_System_Decimal;
112 private Type typeof_System_NonSerializedAttribute;
113 private Type typeof_System_SerializableAttribute;
114 private Type typeof_System_AttributeUsageAttribute;
115 private Type typeof_System_Reflection_AssemblyCultureAttribute;
116 private Type typeof_System_Runtime_InteropServices_DllImportAttribute;
117 private Type typeof_System_Runtime_InteropServices_FieldOffsetAttribute;
118 private Type typeof_System_Runtime_InteropServices_InAttribute;
119 private Type typeof_System_Runtime_InteropServices_MarshalAsAttribute;
120 private Type typeof_System_Runtime_InteropServices_UnmanagedType;
121 private Type typeof_System_Runtime_InteropServices_VarEnum;
122 private Type typeof_System_Runtime_InteropServices_OutAttribute;
123 private Type typeof_System_Runtime_InteropServices_StructLayoutAttribute;
124 private Type typeof_System_Runtime_InteropServices_OptionalAttribute;
125 private Type typeof_System_Runtime_InteropServices_PreserveSigAttribute;
126 private Type typeof_System_Runtime_InteropServices_ComImportAttribute;
127 private Type typeof_System_Runtime_CompilerServices_DecimalConstantAttribute;
128 private Type typeof_System_Runtime_CompilerServices_SpecialNameAttribute;
129 private Type typeof_System_Runtime_CompilerServices_MethodImplAttribute;
130 private Type typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute;
131 private Type typeof_System_Reflection_AssemblyCopyrightAttribute;
132 private Type typeof_System_Reflection_AssemblyTrademarkAttribute;
133 private Type typeof_System_Reflection_AssemblyProductAttribute;
134 private Type typeof_System_Reflection_AssemblyCompanyAttribute;
135 private Type typeof_System_Reflection_AssemblyDescriptionAttribute;
136 private Type typeof_System_Reflection_AssemblyTitleAttribute;
137 private Type typeof_System_Reflection_AssemblyInformationalVersionAttribute;
138 private Type typeof_System_Reflection_AssemblyFileVersionAttribute;
139 private Type typeof_System_Security_Permissions_CodeAccessSecurityAttribute;
140 private Type typeof_System_Security_Permissions_HostProtectionAttribute;
141 private Type typeof_System_Security_Permissions_PermissionSetAttribute;
142 private Type typeof_System_Security_Permissions_SecurityAction;
143 private List<ResolveEventHandler> resolvers = new List<ResolveEventHandler>();
145 internal Assembly Mscorlib
147 get { return Load("mscorlib"); }
150 private Type ImportMscorlibType(System.Type type)
152 return Mscorlib.GetTypeImpl(type.FullName);
155 internal Type System_Object
157 get { return typeof_System_Object ?? (typeof_System_Object = ImportMscorlibType(typeof(System.Object))); }
160 internal Type System_ValueType
162 get { return typeof_System_ValueType ?? (typeof_System_ValueType = ImportMscorlibType(typeof(System.ValueType))); }
165 internal Type System_Enum
167 get { return typeof_System_Enum ?? (typeof_System_Enum = ImportMscorlibType(typeof(System.Enum))); }
170 internal Type System_Void
172 get { return typeof_System_Void ?? (typeof_System_Void = ImportMscorlibType(typeof(void))); }
175 internal Type System_Boolean
177 get { return typeof_System_Boolean ?? (typeof_System_Boolean = ImportMscorlibType(typeof(System.Boolean))); }
180 internal Type System_Char
182 get { return typeof_System_Char ?? (typeof_System_Char = ImportMscorlibType(typeof(System.Char))); }
185 internal Type System_SByte
187 get { return typeof_System_SByte ?? (typeof_System_SByte = ImportMscorlibType(typeof(System.SByte))); }
190 internal Type System_Byte
192 get { return typeof_System_Byte ?? (typeof_System_Byte = ImportMscorlibType(typeof(System.Byte))); }
195 internal Type System_Int16
197 get { return typeof_System_Int16 ?? (typeof_System_Int16 = ImportMscorlibType(typeof(System.Int16))); }
200 internal Type System_UInt16
202 get { return typeof_System_UInt16 ?? (typeof_System_UInt16 = ImportMscorlibType(typeof(System.UInt16))); }
205 internal Type System_Int32
207 get { return typeof_System_Int32 ?? (typeof_System_Int32 = ImportMscorlibType(typeof(System.Int32))); }
210 internal Type System_UInt32
212 get { return typeof_System_UInt32 ?? (typeof_System_UInt32 = ImportMscorlibType(typeof(System.UInt32))); }
215 internal Type System_Int64
217 get { return typeof_System_Int64 ?? (typeof_System_Int64 = ImportMscorlibType(typeof(System.Int64))); }
220 internal Type System_UInt64
222 get { return typeof_System_UInt64 ?? (typeof_System_UInt64 = ImportMscorlibType(typeof(System.UInt64))); }
225 internal Type System_Single
227 get { return typeof_System_Single ?? (typeof_System_Single = ImportMscorlibType(typeof(System.Single))); }
230 internal Type System_Double
232 get { return typeof_System_Double ?? (typeof_System_Double = ImportMscorlibType(typeof(System.Double))); }
235 internal Type System_String
237 get { return typeof_System_String ?? (typeof_System_String = ImportMscorlibType(typeof(System.String))); }
240 internal Type System_IntPtr
242 get { return typeof_System_IntPtr ?? (typeof_System_IntPtr = ImportMscorlibType(typeof(System.IntPtr))); }
245 internal Type System_UIntPtr
247 get { return typeof_System_UIntPtr ?? (typeof_System_UIntPtr = ImportMscorlibType(typeof(System.UIntPtr))); }
250 internal Type System_TypedReference
252 get { return typeof_System_TypedReference ?? (typeof_System_TypedReference = ImportMscorlibType(typeof(System.TypedReference))); }
255 internal Type System_Type
257 get { return typeof_System_Type ?? (typeof_System_Type = ImportMscorlibType(typeof(System.Type))); }
260 internal Type System_Array
262 get { return typeof_System_Array ?? (typeof_System_Array = ImportMscorlibType(typeof(System.Array))); }
265 internal Type System_DateTime
267 get { return typeof_System_DateTime ?? (typeof_System_DateTime = ImportMscorlibType(typeof(System.DateTime))); }
270 internal Type System_DBNull
272 get { return typeof_System_DBNull ?? (typeof_System_DBNull = ImportMscorlibType(typeof(System.DBNull))); }
275 internal Type System_Decimal
277 get { return typeof_System_Decimal ?? (typeof_System_Decimal = ImportMscorlibType(typeof(System.Decimal))); }
280 internal Type System_NonSerializedAttribute
282 get { return typeof_System_NonSerializedAttribute ?? (typeof_System_NonSerializedAttribute = ImportMscorlibType(typeof(System.NonSerializedAttribute))); }
285 internal Type System_SerializableAttribute
287 get { return typeof_System_SerializableAttribute ?? (typeof_System_SerializableAttribute = ImportMscorlibType(typeof(System.SerializableAttribute))); }
290 internal Type System_AttributeUsageAttribute
292 get { return typeof_System_AttributeUsageAttribute ?? (typeof_System_AttributeUsageAttribute = ImportMscorlibType(typeof(System.AttributeUsageAttribute))); }
295 internal Type System_Reflection_AssemblyCultureAttribute
297 get { return typeof_System_Reflection_AssemblyCultureAttribute ?? (typeof_System_Reflection_AssemblyCultureAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyCultureAttribute))); }
300 internal Type System_Runtime_InteropServices_DllImportAttribute
302 get { return typeof_System_Runtime_InteropServices_DllImportAttribute ?? (typeof_System_Runtime_InteropServices_DllImportAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.DllImportAttribute))); }
305 internal Type System_Runtime_InteropServices_FieldOffsetAttribute
307 get { return typeof_System_Runtime_InteropServices_FieldOffsetAttribute ?? (typeof_System_Runtime_InteropServices_FieldOffsetAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.FieldOffsetAttribute))); }
310 internal Type System_Runtime_InteropServices_InAttribute
312 get { return typeof_System_Runtime_InteropServices_InAttribute ?? (typeof_System_Runtime_InteropServices_InAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.InAttribute))); }
315 internal Type System_Runtime_InteropServices_MarshalAsAttribute
317 get { return typeof_System_Runtime_InteropServices_MarshalAsAttribute ?? (typeof_System_Runtime_InteropServices_MarshalAsAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.MarshalAsAttribute))); }
320 internal Type System_Runtime_InteropServices_UnmanagedType
322 get { return typeof_System_Runtime_InteropServices_UnmanagedType ?? (typeof_System_Runtime_InteropServices_UnmanagedType = ImportMscorlibType(typeof(System.Runtime.InteropServices.UnmanagedType))); }
325 internal Type System_Runtime_InteropServices_VarEnum
327 get { return typeof_System_Runtime_InteropServices_VarEnum ?? (typeof_System_Runtime_InteropServices_VarEnum = ImportMscorlibType(typeof(System.Runtime.InteropServices.VarEnum))); }
330 internal Type System_Runtime_InteropServices_OutAttribute
332 get { return typeof_System_Runtime_InteropServices_OutAttribute ?? (typeof_System_Runtime_InteropServices_OutAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.OutAttribute))); }
335 internal Type System_Runtime_InteropServices_StructLayoutAttribute
337 get { return typeof_System_Runtime_InteropServices_StructLayoutAttribute ?? (typeof_System_Runtime_InteropServices_StructLayoutAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.StructLayoutAttribute))); }
340 internal Type System_Runtime_InteropServices_OptionalAttribute
342 get { return typeof_System_Runtime_InteropServices_OptionalAttribute ?? (typeof_System_Runtime_InteropServices_OptionalAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.OptionalAttribute))); }
345 internal Type System_Runtime_InteropServices_PreserveSigAttribute
347 get { return typeof_System_Runtime_InteropServices_PreserveSigAttribute ?? (typeof_System_Runtime_InteropServices_PreserveSigAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.PreserveSigAttribute))); }
350 internal Type System_Runtime_InteropServices_ComImportAttribute
352 get { return typeof_System_Runtime_InteropServices_ComImportAttribute ?? (typeof_System_Runtime_InteropServices_ComImportAttribute = ImportMscorlibType(typeof(System.Runtime.InteropServices.ComImportAttribute))); }
355 internal Type System_Runtime_CompilerServices_DecimalConstantAttribute
357 get { return typeof_System_Runtime_CompilerServices_DecimalConstantAttribute ?? (typeof_System_Runtime_CompilerServices_DecimalConstantAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.DecimalConstantAttribute))); }
360 internal Type System_Runtime_CompilerServices_SpecialNameAttribute
362 get { return typeof_System_Runtime_CompilerServices_SpecialNameAttribute ?? (typeof_System_Runtime_CompilerServices_SpecialNameAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.SpecialNameAttribute))); }
365 internal Type System_Runtime_CompilerServices_MethodImplAttribute
367 get { return typeof_System_Runtime_CompilerServices_MethodImplAttribute ?? (typeof_System_Runtime_CompilerServices_MethodImplAttribute = ImportMscorlibType(typeof(System.Runtime.CompilerServices.MethodImplAttribute))); }
370 internal Type System_Security_SuppressUnmanagedCodeSecurityAttribute
372 get { return typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute ?? (typeof_System_Security_SuppressUnmanagedCodeSecurityAttribute = ImportMscorlibType(typeof(System.Security.SuppressUnmanagedCodeSecurityAttribute))); }
375 internal Type System_Reflection_AssemblyCopyrightAttribute
377 get { return typeof_System_Reflection_AssemblyCopyrightAttribute ?? (typeof_System_Reflection_AssemblyCopyrightAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyCopyrightAttribute))); }
380 internal Type System_Reflection_AssemblyTrademarkAttribute
382 get { return typeof_System_Reflection_AssemblyTrademarkAttribute ?? (typeof_System_Reflection_AssemblyTrademarkAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyTrademarkAttribute))); }
385 internal Type System_Reflection_AssemblyProductAttribute
387 get { return typeof_System_Reflection_AssemblyProductAttribute ?? (typeof_System_Reflection_AssemblyProductAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyProductAttribute))); }
390 internal Type System_Reflection_AssemblyCompanyAttribute
392 get { return typeof_System_Reflection_AssemblyCompanyAttribute ?? (typeof_System_Reflection_AssemblyCompanyAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyCompanyAttribute))); }
395 internal Type System_Reflection_AssemblyDescriptionAttribute
397 get { return typeof_System_Reflection_AssemblyDescriptionAttribute ?? (typeof_System_Reflection_AssemblyDescriptionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyDescriptionAttribute))); }
400 internal Type System_Reflection_AssemblyTitleAttribute
402 get { return typeof_System_Reflection_AssemblyTitleAttribute ?? (typeof_System_Reflection_AssemblyTitleAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyTitleAttribute))); }
405 internal Type System_Reflection_AssemblyInformationalVersionAttribute
407 get { return typeof_System_Reflection_AssemblyInformationalVersionAttribute ?? (typeof_System_Reflection_AssemblyInformationalVersionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyInformationalVersionAttribute))); }
410 internal Type System_Reflection_AssemblyFileVersionAttribute
412 get { return typeof_System_Reflection_AssemblyFileVersionAttribute ?? (typeof_System_Reflection_AssemblyFileVersionAttribute = ImportMscorlibType(typeof(System.Reflection.AssemblyFileVersionAttribute))); }
415 internal Type System_Security_Permissions_CodeAccessSecurityAttribute
417 get { return typeof_System_Security_Permissions_CodeAccessSecurityAttribute ?? (typeof_System_Security_Permissions_CodeAccessSecurityAttribute = ImportMscorlibType(typeof(System.Security.Permissions.CodeAccessSecurityAttribute))); }
420 internal Type System_Security_Permissions_HostProtectionAttribute
422 get { return typeof_System_Security_Permissions_HostProtectionAttribute ?? (typeof_System_Security_Permissions_HostProtectionAttribute = ImportMscorlibType(typeof(System.Security.Permissions.HostProtectionAttribute))); }
425 internal Type System_Security_Permissions_PermissionSetAttribute
427 get { return typeof_System_Security_Permissions_PermissionSetAttribute ?? (typeof_System_Security_Permissions_PermissionSetAttribute = ImportMscorlibType(typeof(System.Security.Permissions.PermissionSetAttribute))); }
430 internal Type System_Security_Permissions_SecurityAction
432 get { return typeof_System_Security_Permissions_SecurityAction ?? (typeof_System_Security_Permissions_SecurityAction = ImportMscorlibType(typeof(System.Security.Permissions.SecurityAction))); }
435 internal bool HasMscorlib
437 get { return GetLoadedAssembly("mscorlib") != null; }
440 public event ResolveEventHandler AssemblyResolve
442 add { resolvers.Add(value); }
443 remove { resolvers.Remove(value); }
446 public Type Import(System.Type type)
449 if (!importedTypes.TryGetValue(type, out imported))
451 imported = ImportImpl(type);
452 if (imported != null)
454 importedTypes.Add(type, imported);
460 private Type ImportImpl(System.Type type)
462 if (type.Assembly == typeof(IKVM.Reflection.Type).Assembly)
464 throw new ArgumentException("Did you really want to import " + type.FullName + "?");
466 if (type.HasElementType)
470 if (type.Name.EndsWith("[]"))
472 return Import(type.GetElementType()).MakeArrayType();
476 return Import(type.GetElementType()).MakeArrayType(type.GetArrayRank());
479 else if (type.IsByRef)
481 return Import(type.GetElementType()).MakeByRefType();
483 else if (type.IsPointer)
485 return Import(type.GetElementType()).MakePointerType();
489 throw new InvalidOperationException();
492 else if (type.IsGenericParameter)
494 if (type.DeclaringMethod != null)
496 throw new NotImplementedException();
500 return Import(type.DeclaringType).GetGenericArguments()[type.GenericParameterPosition];
503 else if (type.IsGenericType && !type.IsGenericTypeDefinition)
505 System.Type[] args = type.GetGenericArguments();
506 Type[] importedArgs = new Type[args.Length];
507 for (int i = 0; i < args.Length; i++)
509 importedArgs[i] = Import(args[i]);
511 return Import(type.GetGenericTypeDefinition()).MakeGenericType(importedArgs);
515 return Import(type.Assembly).GetType(type.FullName);
519 private Assembly Import(System.Reflection.Assembly asm)
521 return Load(asm.FullName);
524 public RawModule OpenRawModule(string path)
526 path = Path.GetFullPath(path);
527 return OpenRawModule(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read), path);
530 public RawModule OpenRawModule(Stream stream, string location)
532 if (!stream.CanRead || !stream.CanSeek)
534 throw new NotSupportedException();
536 return new RawModule(new ModuleReader(null, this, stream, location));
539 public Assembly LoadAssembly(RawModule module)
541 string refname = module.GetAssemblyName().FullName;
542 Assembly asm = GetLoadedAssembly(refname);
545 asm = module.ToAssembly();
551 public Assembly LoadFile(string path)
555 using (RawModule module = OpenRawModule(path))
557 return LoadAssembly(module);
560 catch (IOException x)
562 throw new FileNotFoundException(x.Message, x);
564 catch (UnauthorizedAccessException x)
566 throw new FileNotFoundException(x.Message, x);
570 private Assembly GetLoadedAssembly(string refname)
573 if (!assembliesByName.TryGetValue(refname, out asm))
575 for (int i = 0; i < assemblies.Count; i++)
577 AssemblyComparisonResult result;
578 // We won't allow FX unification here, because our own (non-Fusion) implementation of CompareAssemblyIdentity doesn't support it and
579 // we don't want to create a fundamental functional difference based on that.
580 if (CompareAssemblyIdentity(refname, false, assemblies[i].FullName, false, out result) && result != AssemblyComparisonResult.EquivalentFXUnified)
583 assembliesByName.Add(refname, asm);
591 private Assembly GetDynamicAssembly(string refname)
593 foreach (AssemblyBuilder asm in dynamicAssemblies)
595 AssemblyComparisonResult result;
596 // We won't allow FX unification here, because our own (non-Fusion) implementation of CompareAssemblyIdentity doesn't support it and
597 // we don't want to create a fundamental functional difference based on that.
598 if (CompareAssemblyIdentity(refname, false, asm.FullName, false, out result) && result != AssemblyComparisonResult.EquivalentFXUnified)
606 public Assembly Load(string refname)
608 return Load(refname, null, true);
611 internal Assembly Load(string refname, Assembly requestingAssembly, bool throwOnError)
613 Assembly asm = GetLoadedAssembly(refname);
618 if (resolvers.Count == 0)
620 asm = DefaultResolver(refname, throwOnError);
624 ResolveEventArgs args = new ResolveEventArgs(refname, requestingAssembly);
625 foreach (ResolveEventHandler evt in resolvers)
627 asm = evt(this, args);
635 asm = GetDynamicAssembly(refname);
640 string defname = asm.FullName;
641 if (refname != defname)
643 assembliesByName.Add(refname, asm);
649 throw new FileNotFoundException(refname);
654 private Assembly DefaultResolver(string refname, bool throwOnError)
656 Assembly asm = GetDynamicAssembly(refname);
666 fileName = System.Reflection.Assembly.ReflectionOnlyLoad(refname).Location;
668 catch (System.BadImageFormatException x)
670 throw new BadImageFormatException(x.Message, x);
677 fileName = System.Reflection.Assembly.ReflectionOnlyLoad(refname).Location;
679 catch (System.BadImageFormatException x)
681 throw new BadImageFormatException(x.Message, x);
683 catch (FileNotFoundException)
685 // we intentionally only swallow the FileNotFoundException, if the file exists but isn't a valid assembly,
686 // we should throw an exception
690 return LoadFile(fileName);
693 public Type GetType(string assemblyQualifiedTypeName)
695 // to be more compatible with Type.GetType(), we could call Assembly.GetCallingAssembly(),
696 // import that assembly and pass it as the context, but implicitly importing is considered evil
697 return GetType(null, assemblyQualifiedTypeName, false);
700 public Type GetType(string assemblyQualifiedTypeName, bool throwOnError)
702 // to be more compatible with Type.GetType(), we could call Assembly.GetCallingAssembly(),
703 // import that assembly and pass it as the context, but implicitly importing is considered evil
704 return GetType(null, assemblyQualifiedTypeName, throwOnError);
707 // note that context is slightly different from the calling assembly (System.Type.GetType),
708 // because context is passed to the AssemblyResolve event as the RequestingAssembly
709 public Type GetType(Assembly context, string assemblyQualifiedTypeName, bool throwOnError)
711 TypeNameParser parser = TypeNameParser.Parse(assemblyQualifiedTypeName, throwOnError);
716 return parser.GetType(this, context, throwOnError, assemblyQualifiedTypeName);
719 public Assembly[] GetAssemblies()
721 Assembly[] array = new Assembly[assemblies.Count + dynamicAssemblies.Count];
722 assemblies.CopyTo(array);
723 for (int i = 0, j = assemblies.Count; j < array.Length; i++, j++)
725 array[j] = dynamicAssemblies[i];
730 // this is equivalent to the Fusion CompareAssemblyIdentity API
731 public bool CompareAssemblyIdentity(string assemblyIdentity1, bool unified1, string assemblyIdentity2, bool unified2, out AssemblyComparisonResult result)
733 return Fusion.CompareAssemblyIdentity(assemblyIdentity1, unified1, assemblyIdentity2, unified2, out result);
736 public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access)
738 return DefineDynamicAssemblyImpl(name, access, null, null, null, null);
741 public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, string dir)
743 return DefineDynamicAssemblyImpl(name, access, dir, null, null, null);
749 public AssemblyBuilder DefineDynamicAssembly(AssemblyName name, AssemblyBuilderAccess access, string dir, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet refusedPermissions)
751 return DefineDynamicAssemblyImpl(name, access, dir, requiredPermissions, optionalPermissions, refusedPermissions);
754 private AssemblyBuilder DefineDynamicAssemblyImpl(AssemblyName name, AssemblyBuilderAccess access, string dir, PermissionSet requiredPermissions, PermissionSet optionalPermissions, PermissionSet refusedPermissions)
756 AssemblyBuilder asm = new AssemblyBuilder(this, name, dir, requiredPermissions, optionalPermissions, refusedPermissions);
757 dynamicAssemblies.Add(asm);
761 internal void RenameAssembly(Assembly assembly, AssemblyName oldName)
763 List<string> remove = new List<string>();
764 foreach (KeyValuePair<string, Assembly> kv in assembliesByName)
766 if (kv.Value == assembly)
771 foreach (string key in remove)
773 assembliesByName.Remove(key);
777 public void Dispose()
779 foreach (Assembly asm in assemblies)
781 foreach (Module mod in asm.GetLoadedModules())
786 foreach (AssemblyBuilder asm in dynamicAssemblies)
788 foreach (Module mod in asm.GetLoadedModules())
795 public Assembly CreateMissingAssembly(string assemblyName)
797 return new MissingAssembly(this, assemblyName);