Merge pull request #301 from directhex/master
[mono.git] / mcs / class / corlib / System.Reflection / Assembly.cs
1 //
2 // System.Reflection/Assembly.cs
3 //
4 // Author:
5 //   Paolo Molaro (lupus@ximian.com)
6 //
7 // (C) 2001 Ximian, Inc.  http://www.ximian.com
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
9 // Copyright 2011 Xamarin Inc (http://www.xamarin.com).
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30
31 using System.Security;
32 using System.Security.Policy;
33 using System.Security.Permissions;
34 using System.Runtime.Serialization;
35 using System.Reflection;
36 using System.IO;
37 using System.Globalization;
38 using System.Runtime.CompilerServices;
39 using System.Runtime.InteropServices;
40 using System.Collections.Generic;
41 using System.Configuration.Assemblies;
42
43 using Mono.Security;
44
45 namespace System.Reflection {
46
47         [ComVisible (true)]
48         [ComDefaultInterfaceAttribute (typeof (_Assembly))]
49         [Serializable]
50         [ClassInterface(ClassInterfaceType.None)]
51         [StructLayout (LayoutKind.Sequential)]
52 #if MOBILE
53         public partial class Assembly : ICustomAttributeProvider, _Assembly {
54 #elif MOONLIGHT
55         public abstract class Assembly : ICustomAttributeProvider, _Assembly {
56 #elif NET_4_0
57         public abstract class Assembly : ICustomAttributeProvider, _Assembly, IEvidenceFactory, ISerializable {
58 #else
59         public partial class Assembly : ICustomAttributeProvider, _Assembly, IEvidenceFactory, ISerializable {
60 #endif
61                 internal class ResolveEventHolder {
62                         public event ModuleResolveEventHandler ModuleResolve;
63                 }
64
65                 // Note: changes to fields must be reflected in _MonoReflectionAssembly struct (object-internals.h)
66 #pragma warning disable 649
67                 private IntPtr _mono_assembly;
68 #pragma warning restore 649
69
70                 private ResolveEventHolder resolve_event_holder;
71                 private Evidence _evidence;
72                 internal PermissionSet _minimum;        // for SecurityAction.RequestMinimum
73                 internal PermissionSet _optional;       // for SecurityAction.RequestOptional
74                 internal PermissionSet _refuse;         // for SecurityAction.RequestRefuse
75                 private PermissionSet _granted;         // for the resolved assembly granted permissions
76                 private PermissionSet _denied;          // for the resolved assembly denied permissions
77                 private bool fromByteArray;
78                 private string assemblyName;
79
80 #if NET_4_0 || MOONLIGHT || MOBILE
81                 protected
82 #else
83                 internal
84 #endif
85                 Assembly () 
86                 {
87                         resolve_event_holder = new ResolveEventHolder ();
88                 }
89
90                 //
91                 // We can't store the event directly in this class, since the
92                 // compiler would silently insert the fields before _mono_assembly
93                 //
94                 public event ModuleResolveEventHandler ModuleResolve {
95                         [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
96                         add {
97                                 resolve_event_holder.ModuleResolve += value;
98                         }
99                         [SecurityPermission (SecurityAction.LinkDemand, ControlAppDomain = true)]
100                         remove {
101                                 resolve_event_holder.ModuleResolve -= value;
102                         }
103                 }
104
105                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
106                 private extern string get_code_base (bool escaped);
107
108                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
109                 private extern string get_fullname ();
110
111                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
112                 private extern string get_location ();
113
114                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
115                 private extern string InternalImageRuntimeVersion ();
116
117                 // SECURITY: this should be the only caller to icall get_code_base
118                 private string GetCodeBase (bool escaped)
119                 {
120                         string cb = get_code_base (escaped);
121 #if !NET_2_1
122                         if (SecurityManager.SecurityEnabled) {
123                                 // we cannot divulge local file informations
124                                 if (String.Compare ("FILE://", 0, cb, 0, 7, true, CultureInfo.InvariantCulture) == 0) {
125                                         string file = cb.Substring (7);
126                                         new FileIOPermission (FileIOPermissionAccess.PathDiscovery, file).Demand ();
127                                 }
128                         }
129 #endif
130                         return cb;
131                 }
132
133                 public virtual string CodeBase {
134                         get { return GetCodeBase (false); }
135                 }
136
137                 public virtual string EscapedCodeBase {
138                         get { return GetCodeBase (true); }
139                 }
140
141                 public virtual string FullName {
142                         get {
143                                 //
144                                 // FIXME: This is wrong, but it gets us going
145                                 // in the compiler for now
146                                 //
147                                 return ToString ();
148                         }
149                 }
150
151                 public virtual extern MethodInfo EntryPoint {
152                         [MethodImplAttribute (MethodImplOptions.InternalCall)]
153                         get;
154                 }
155 #if !MOONLIGHT
156                 public virtual Evidence Evidence {
157                         [SecurityPermission (SecurityAction.Demand, ControlEvidence = true)]
158                         get { return UnprotectedGetEvidence (); }
159                 }
160
161                 // note: the security runtime requires evidences but may be unable to do so...
162                 internal Evidence UnprotectedGetEvidence ()
163                 {
164 #if MOBILE
165                         return null;
166 #else
167                         // if the host (runtime) hasn't provided it's own evidence...
168                         if (_evidence == null) {
169                                 // ... we will provide our own
170                                 lock (this) {
171                                         _evidence = Evidence.GetDefaultHostEvidence (this);
172                                 }
173                         }
174                         return _evidence;
175 #endif
176                 }
177
178                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
179                 internal extern bool get_global_assembly_cache ();
180
181 #endif
182                 internal bool FromByteArray {
183                         set { fromByteArray = value; }
184                 }
185
186                 public virtual String Location {
187                         get {
188                                 if (fromByteArray)
189                                         return String.Empty;
190
191                                 string loc = get_location ();
192 #if !NET_2_1
193                                 if ((loc != String.Empty) && SecurityManager.SecurityEnabled) {
194                                         // we cannot divulge local file informations
195                                         new FileIOPermission (FileIOPermissionAccess.PathDiscovery, loc).Demand ();
196                                 }
197 #endif
198                                 return loc;
199                         }
200                 }
201
202                 [ComVisible (false)]
203                 public virtual string ImageRuntimeVersion {
204                         get {
205                                 return InternalImageRuntimeVersion ();
206                         }
207                 }
208
209                 [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
210                 public virtual void GetObjectData (SerializationInfo info, StreamingContext context)
211                 {
212                         if (info == null)
213                                 throw new ArgumentNullException ("info");
214
215                         UnitySerializationHolder.GetAssemblyData (this, info, context);
216                 }
217
218                 public virtual bool IsDefined (Type attributeType, bool inherit)
219                 {
220                         return MonoCustomAttrs.IsDefined (this, attributeType, inherit);
221                 }
222
223                 public virtual object [] GetCustomAttributes (bool inherit)
224                 {
225                         return MonoCustomAttrs.GetCustomAttributes (this, inherit);
226                 }
227
228                 public virtual object [] GetCustomAttributes (Type attributeType, bool inherit)
229                 {
230                         return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit);
231                 }
232
233                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
234                 private extern object GetFilesInternal (String name, bool getResourceModules);
235
236                 public virtual FileStream[] GetFiles ()
237                 {
238                         return GetFiles (false);
239                 }
240
241                 public virtual FileStream [] GetFiles (bool getResourceModules)
242                 {
243                         string[] names = (string[]) GetFilesInternal (null, getResourceModules);
244                         if (names == null)
245                                 return new FileStream [0];
246
247                         string location = Location;
248
249                         FileStream[] res;
250                         if (location != String.Empty) {
251                                 res = new FileStream [names.Length + 1];
252                                 res [0] = new FileStream (location, FileMode.Open, FileAccess.Read);
253                                 for (int i = 0; i < names.Length; ++i)
254                                         res [i + 1] = new FileStream (names [i], FileMode.Open, FileAccess.Read);
255                         } else {
256                                 res = new FileStream [names.Length];
257                                 for (int i = 0; i < names.Length; ++i)
258                                         res [i] = new FileStream (names [i], FileMode.Open, FileAccess.Read);
259                         }
260                         return res;
261                 }
262
263                 public virtual FileStream GetFile (String name)
264                 {
265                         if (name == null)
266                                 throw new ArgumentNullException (null, "Name cannot be null.");
267                         if (name.Length == 0)
268                                 throw new ArgumentException ("Empty name is not valid");
269
270                         string filename = (string)GetFilesInternal (name, true);
271                         if (filename != null)
272                                 return new FileStream (filename, FileMode.Open, FileAccess.Read);
273                         else
274                                 return null;
275                 }
276
277                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
278                 internal extern IntPtr GetManifestResourceInternal (String name, out int size, out Module module);
279
280                 public virtual Stream GetManifestResourceStream (String name)
281                 {
282                         if (name == null)
283                                 throw new ArgumentNullException ("name");
284                         if (name.Length == 0)
285                                 throw new ArgumentException ("String cannot have zero length.",
286                                         "name");
287
288                         ManifestResourceInfo info = GetManifestResourceInfo (name);
289                         if (info == null) {
290                                 Assembly a = AppDomain.CurrentDomain.DoResourceResolve (name, this);
291                                 if (a != null && a != this)
292                                         return a.GetManifestResourceStream (name);
293                                 else
294                                         return null;
295                         }
296
297                         if (info.ReferencedAssembly != null)
298                                 return info.ReferencedAssembly.GetManifestResourceStream (name);
299                         if ((info.FileName != null) && (info.ResourceLocation == 0)) {
300                                 if (fromByteArray)
301                                         throw new FileNotFoundException (info.FileName);
302
303                                 string location = Path.GetDirectoryName (Location);
304                                 string filename = Path.Combine (location, info.FileName);
305 #if MOONLIGHT
306                                 // we don't control the content of 'info.FileName' so we want to make sure we keep to ourselves
307                                 filename = Path.GetFullPath (filename);
308                                 if (!filename.StartsWith (location))
309                                         throw new SecurityException ("non-rooted access to manifest resource");
310 #endif
311                                 return new FileStream (filename, FileMode.Open, FileAccess.Read);
312                         }
313
314                         int size;
315                         Module module;
316                         IntPtr data = GetManifestResourceInternal (name, out size, out module);
317                         if (data == (IntPtr) 0)
318                                 return null;
319                         else {
320                                 UnmanagedMemoryStream stream;
321                                 unsafe {
322                                         stream = new UnmanagedMemoryStream ((byte*) data, size);
323                                 }
324                                 /* 
325                                  * The returned pointer points inside metadata, so
326                                  * we have to increase the refcount of the module, and decrease
327                                  * it when the stream is finalized.
328                                  */
329                                 stream.Closed += new EventHandler (new ResourceCloseHandler (module).OnClose);
330                                 return stream;
331                         }
332                 }
333
334                 public virtual Stream GetManifestResourceStream (Type type, String name)
335                 {
336                         string ns;
337                         if (type != null) {
338                                 ns = type.Namespace;
339                         } else {
340                                 if (name == null)
341                                         throw new ArgumentNullException ("type");
342                                 ns = null;
343                         }
344
345                         if (ns == null || ns.Length == 0)
346                                 return GetManifestResourceStream (name);
347                         else
348                                 return GetManifestResourceStream (ns + "." + name);
349                 }
350
351                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
352                 internal virtual extern Type[] GetTypes (bool exportedOnly);
353                 
354                 public virtual Type[] GetTypes ()
355                 {
356                         return GetTypes (false);
357                 }
358
359                 public virtual Type[] GetExportedTypes ()
360                 {
361                         return GetTypes (true);
362                 }
363
364                 public virtual Type GetType (String name, Boolean throwOnError)
365                 {
366                         return GetType (name, throwOnError, false);
367                 }
368
369                 public virtual Type GetType (String name) {
370                         return GetType (name, false, false);
371                 }
372
373                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
374                 internal extern Type InternalGetType (Module module, String name, Boolean throwOnError, Boolean ignoreCase);
375
376                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
377                 internal extern static void InternalGetAssemblyName (string assemblyFile, AssemblyName aname);
378
379                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
380                 static extern void FillName (Assembly ass, AssemblyName aname);
381
382                 [MonoTODO ("copiedName == true is not supported")]
383                 public virtual AssemblyName GetName (Boolean copiedName)
384                 {
385                         // CodeBase, which is restricted, will be copied into the AssemblyName object so...
386                         if (SecurityManager.SecurityEnabled) {
387                                 GetCodeBase (true); // this will ensure the Demand is made
388                         }
389                         return UnprotectedGetName ();
390                 }
391
392                 public virtual AssemblyName GetName ()
393                 {
394                         return GetName (false);
395                 }
396
397                 // the security runtime requires access to the assemblyname (e.g. to get the strongname)
398                 internal virtual AssemblyName UnprotectedGetName ()
399                 {
400                         AssemblyName aname = new AssemblyName ();
401                         FillName (this, aname);
402                         return aname;
403                 }
404
405                 public override string ToString ()
406                 {
407                         // note: ToString work without requiring CodeBase (so no checks are needed)
408
409                         if (assemblyName != null)
410                                 return assemblyName;
411
412                         assemblyName = get_fullname ();
413                         return assemblyName;
414                 }
415
416                 public static String CreateQualifiedName (String assemblyName, String typeName) 
417                 {
418                         return typeName + ", " + assemblyName;
419                 }
420
421                 public static Assembly GetAssembly (Type type)
422                 {
423                         if (type != null)
424                                 return type.Assembly;
425                         throw new ArgumentNullException ("type");
426                 }
427
428
429                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
430                 public static extern Assembly GetEntryAssembly();
431
432                 internal Assembly GetSatelliteAssemblyNoThrow (CultureInfo culture, Version version)
433                 {
434                         return GetSatelliteAssembly (culture, version, false);
435                 }
436
437                 internal Assembly GetSatelliteAssembly (CultureInfo culture, Version version, bool throwOnError)
438                 {
439                         if (culture == null)
440                                 throw new ArgumentException ("culture");
441
442                         AssemblyName aname = GetName (true);
443                         if (version != null)
444                                 aname.Version = version;
445
446                         aname.CultureInfo = culture;
447                         aname.Name = aname.Name + ".resources";
448                         Assembly assembly;
449
450                         try {
451                                 assembly = AppDomain.CurrentDomain.LoadSatellite (aname, false);
452                                 if (assembly != null)
453                                         return assembly;
454                         } catch (FileNotFoundException) {
455                                 assembly = null;
456                                 // ignore
457                         }
458
459                         // Try the assembly directory
460                         string location = Path.GetDirectoryName (Location);
461                         string fullName = Path.Combine (location, Path.Combine (culture.Name, aname.Name + ".dll"));
462 #if MOONLIGHT
463                         // it's unlikely that culture.Name or aname.Name could contain stuff like ".." but...
464                         fullName = Path.GetFullPath (fullName);
465                         if (!fullName.StartsWith (location)) {
466                                 if (throwOnError)
467                                         throw new SecurityException ("non-rooted access to satellite assembly");
468                                 return null;
469                         }
470 #endif
471                         if (!throwOnError && !File.Exists (fullName))
472                                 return null;
473
474                         return LoadFrom (fullName);
475                 }
476                 
477                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
478                 private extern static Assembly LoadFrom (String assemblyFile, bool refonly);
479
480                 public static Assembly LoadFrom (String assemblyFile)
481                 {
482                         return LoadFrom (assemblyFile, false);
483                 }
484
485 #if NET_4_0
486                 [Obsolete]
487 #endif
488                 public static Assembly LoadFrom (String assemblyFile, Evidence securityEvidence)
489                 {
490                         Assembly a = LoadFrom (assemblyFile, false);
491 #if !NET_2_1
492                         if ((a != null) && (securityEvidence != null)) {
493                                 // merge evidence (i.e. replace defaults with provided evidences)
494                                 a.Evidence.Merge (securityEvidence);
495                         }
496 #endif
497                         return a;
498                 }
499
500 #if NET_4_0
501                 [Obsolete]
502 #endif
503                 [MonoTODO("This overload is not currently implemented")]
504                 // FIXME: What are we missing?
505                 public static Assembly LoadFrom (String assemblyFile, Evidence securityEvidence, byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
506                 {
507                         throw new NotImplementedException ();
508                 }
509
510 #if NET_4_0
511                 [MonoTODO]
512                 public static Assembly LoadFrom (String assemblyFile, byte [] hashValue, AssemblyHashAlgorithm hashAlgorithm)
513                 {
514                         throw new NotImplementedException ();
515                 }
516 #endif
517
518 #if NET_4_0
519                 public static Assembly UnsafeLoadFrom (String assemblyFile)
520                 {
521                         return LoadFrom (assemblyFile);
522                 }
523 #endif
524
525 #if NET_4_0
526                 [Obsolete]
527 #endif
528                 public static Assembly LoadFile (String path, Evidence securityEvidence)
529                 {
530                         if (path == null)
531                                 throw new ArgumentNullException ("path");
532                         if (path == String.Empty)
533                                 throw new ArgumentException ("Path can't be empty", "path");
534                         // FIXME: Make this do the right thing
535                         return LoadFrom (path, securityEvidence);
536                 }
537
538                 public static Assembly LoadFile (String path)
539                 {
540                         return LoadFile (path, null);
541                 }
542
543                 public static Assembly Load (String assemblyString)
544                 {
545                         return AppDomain.CurrentDomain.Load (assemblyString);
546                 }
547
548 #if NET_4_0
549                 [Obsolete]
550 #endif          
551                 public static Assembly Load (String assemblyString, Evidence assemblySecurity)
552                 {
553                         return AppDomain.CurrentDomain.Load (assemblyString, assemblySecurity);
554                 }
555
556                 public static Assembly Load (AssemblyName assemblyRef)
557                 {
558                         return AppDomain.CurrentDomain.Load (assemblyRef);
559                 }
560
561 #if NET_4_0
562                 [Obsolete]
563 #endif
564                 public static Assembly Load (AssemblyName assemblyRef, Evidence assemblySecurity)
565                 {
566                         return AppDomain.CurrentDomain.Load (assemblyRef, assemblySecurity);
567                 }
568
569                 public static Assembly Load (Byte[] rawAssembly)
570                 {
571                         return AppDomain.CurrentDomain.Load (rawAssembly);
572                 }
573
574                 public static Assembly Load (Byte[] rawAssembly, Byte[] rawSymbolStore)
575                 {
576                         return AppDomain.CurrentDomain.Load (rawAssembly, rawSymbolStore);
577                 }
578
579 #if NET_4_0
580                 [Obsolete]
581 #endif
582                 public static Assembly Load (Byte[] rawAssembly, Byte[] rawSymbolStore,
583                                              Evidence securityEvidence)
584                 {
585                         return AppDomain.CurrentDomain.Load (rawAssembly, rawSymbolStore, securityEvidence);
586                 }
587
588 #if NET_4_0
589                 [MonoLimitation ("Argument securityContextSource is ignored")]
590                 public static Assembly Load (byte [] rawAssembly, byte [] rawSymbolStore, SecurityContextSource securityContextSource)
591                 {
592                         return AppDomain.CurrentDomain.Load (rawAssembly, rawSymbolStore);
593                 }
594 #endif
595
596                 public static Assembly ReflectionOnlyLoad (byte[] rawAssembly)
597                 {
598                         return AppDomain.CurrentDomain.Load (rawAssembly, null, null, true);
599                 }
600
601                 public static Assembly ReflectionOnlyLoad (string assemblyString) 
602                 {
603                         return AppDomain.CurrentDomain.Load (assemblyString, null, true);
604                 }
605
606                 public static Assembly ReflectionOnlyLoadFrom (string assemblyFile) 
607                 {
608                         if (assemblyFile == null)
609                                 throw new ArgumentNullException ("assemblyFile");
610                         
611                         return LoadFrom (assemblyFile, true);
612                 }
613
614                 [Obsolete]
615                 public static Assembly LoadWithPartialName (string partialName)
616                 {
617                         return LoadWithPartialName (partialName, null);
618                 }
619
620                 [MonoTODO ("Not implemented")]
621                 public Module LoadModule (string moduleName, byte [] rawModule)
622                 {
623                         throw new NotImplementedException ();
624                 }
625
626                 [MonoTODO ("Not implemented")]
627                 public
628 #if NET_4_0 || MOONLIGHT || MOBILE
629                 virtual
630 #endif
631                 Module LoadModule (string moduleName, byte [] rawModule, byte [] rawSymbolStore)
632                 {
633                         throw new NotImplementedException ();
634                 }
635
636                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
637                 private static extern Assembly load_with_partial_name (string name, Evidence e);
638
639                 [Obsolete]
640                 public static Assembly LoadWithPartialName (string partialName, Evidence securityEvidence)
641                 {
642                         return LoadWithPartialName (partialName, securityEvidence, true);
643                 }
644
645                 /**
646                  * LAMESPEC: It is possible for this method to throw exceptions IF the name supplied
647                  * is a valid gac name and contains filesystem entry charachters at the end of the name
648                  * ie System/// will throw an exception. However ////System will not as that is canocolized
649                  * out of the name.
650                  */
651
652                 // FIXME: LoadWithPartialName must look cache (no CAS) or read from disk (CAS)
653                 internal static Assembly LoadWithPartialName (string partialName, Evidence securityEvidence, bool oldBehavior)
654                 {
655                         if (!oldBehavior)
656                                 throw new NotImplementedException ();
657
658                         if (partialName == null)
659                                 throw new NullReferenceException ();
660
661                         return load_with_partial_name (partialName, securityEvidence);
662                 }
663
664                 public Object CreateInstance (String typeName) 
665                 {
666                         return CreateInstance (typeName, false);
667                 }
668
669                 public Object CreateInstance (String typeName, Boolean ignoreCase)
670                 {
671                         Type t = GetType (typeName, false, ignoreCase);
672                         if (t == null)
673                                 return null;
674
675                         try {
676                                 return Activator.CreateInstance (t);
677                         } catch (InvalidOperationException) {
678                                 throw new ArgumentException ("It is illegal to invoke a method on a Type loaded via ReflectionOnly methods.");
679                         }
680                 }
681
682                 public
683 #if NET_4_0 || MOONLIGHT || MOBILE
684                 virtual
685 #endif
686                 Object CreateInstance (String typeName, Boolean ignoreCase,
687                                               BindingFlags bindingAttr, Binder binder,
688                                               Object[] args, CultureInfo culture,
689                                               Object[] activationAttributes)
690                 {
691                         Type t = GetType (typeName, false, ignoreCase);
692                         if (t == null)
693                                 return null;
694
695                         try {
696                                 return Activator.CreateInstance (t, bindingAttr, binder, args, culture, activationAttributes);
697                         } catch (InvalidOperationException) {
698                                 throw new ArgumentException ("It is illegal to invoke a method on a Type loaded via ReflectionOnly methods.");
699                         }
700                 }
701
702                 public Module[] GetLoadedModules ()
703                 {
704                         return GetLoadedModules (false);
705                 }
706
707                 public Module[] GetModules ()
708                 {
709                         return GetModules (false);
710                 }
711
712                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
713                 internal virtual extern Module[] GetModulesInternal ();
714
715
716                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
717                 internal extern string[] GetNamespaces ();
718                 
719                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
720                 public extern virtual String[] GetManifestResourceNames ();
721
722                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
723                 public extern static Assembly GetExecutingAssembly ();
724
725                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
726                 public extern static Assembly GetCallingAssembly ();
727
728                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
729                 internal static extern AssemblyName[] GetReferencedAssemblies (Assembly module);
730
731                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
732                 private extern bool GetManifestResourceInfoInternal (String name, ManifestResourceInfo info);
733
734                 public virtual ManifestResourceInfo GetManifestResourceInfo (String resourceName)
735                 {
736                         if (resourceName == null)
737                                 throw new ArgumentNullException ("resourceName");
738                         if (resourceName.Length == 0)
739                                 throw new ArgumentException ("String cannot have zero length.");
740                         ManifestResourceInfo result = new ManifestResourceInfo ();
741                         bool found = GetManifestResourceInfoInternal (resourceName, result);
742                         if (found)
743                                 return result;
744                         else
745                                 return null;
746                 }
747
748                 private class ResourceCloseHandler {
749 #pragma warning disable 169, 414
750                         Module module;
751 #pragma warning restore 169, 414                        
752
753                         public ResourceCloseHandler (Module module) {
754                                 this.module = module;
755                         }
756
757                         public void OnClose (object sender, EventArgs e) {
758                                 // The module dtor will take care of things
759                                 module = null;
760                         }
761                 }
762
763                 //
764                 // The following functions are only for the Mono Debugger.
765                 //
766
767                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
768                 internal static extern int MonoDebugger_GetMethodToken (MethodBase method);
769
770                 [MonoTODO ("Currently it always returns zero")]
771                 [ComVisible (false)]
772                 public
773 #if NET_4_0 || MOONLIGHT || MOBILE
774                 virtual
775 #endif
776                 long HostContext {
777                         get { return 0; }
778                 }
779
780
781                 internal virtual Module GetManifestModule () {
782                         return GetManifestModuleInternal ();
783                 }
784
785                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
786                 internal extern Module GetManifestModuleInternal ();
787
788                 [ComVisible (false)]
789                 public virtual extern bool ReflectionOnly {
790                         [MethodImplAttribute (MethodImplOptions.InternalCall)]
791                         get;
792                 }
793                 
794                 public override int GetHashCode ()
795                 {
796                         return base.GetHashCode ();
797                 }
798
799                 public override bool Equals (object o)
800                 {
801                         if (((object) this) == o)
802                                 return true;
803
804                         if (o == null)
805                                 return false;
806                         
807                         Assembly other = (Assembly) o;
808                         return other._mono_assembly == _mono_assembly;
809                 }
810
811 #if !NET_2_1
812                 // Code Access Security
813
814                 internal void Resolve () 
815                 {
816                         lock (this) {
817                                 // FIXME: As we (currently) delay the resolution until the first CAS
818                                 // Demand it's too late to evaluate the Minimum permission set as a 
819                                 // condition to load the assembly into the AppDomain
820                                 LoadAssemblyPermissions ();
821                                 Evidence e = new Evidence (UnprotectedGetEvidence ()); // we need a copy to add PRE
822                                 e.AddHost (new PermissionRequestEvidence (_minimum, _optional, _refuse));
823                                 _granted = SecurityManager.ResolvePolicy (e,
824                                         _minimum, _optional, _refuse, out _denied);
825                         }
826                 }
827
828                 internal PermissionSet GrantedPermissionSet {
829                         get {
830                                 if (_granted == null) {
831                                         if (SecurityManager.ResolvingPolicyLevel != null) {
832                                                 if (SecurityManager.ResolvingPolicyLevel.IsFullTrustAssembly (this))
833                                                         return DefaultPolicies.FullTrust;
834                                                 else
835                                                         return null; // we can't resolve during resolution
836                                         }
837                                         Resolve ();
838                                 }
839                                 return _granted;
840                         }
841                 }
842
843                 internal PermissionSet DeniedPermissionSet {
844                         get {
845                                 // yes we look for granted, as denied may be null
846                                 if (_granted == null) {
847                                         if (SecurityManager.ResolvingPolicyLevel != null) {
848                                                 if (SecurityManager.ResolvingPolicyLevel.IsFullTrustAssembly (this))
849                                                         return null;
850                                                 else
851                                                         return DefaultPolicies.FullTrust; // deny unrestricted
852                                         }
853                                         Resolve ();
854                                 }
855                                 return _denied;
856                         }
857                 }
858
859                 [MethodImplAttribute (MethodImplOptions.InternalCall)]
860                 extern internal static bool LoadPermissions (Assembly a, 
861                         ref IntPtr minimum, ref int minLength,
862                         ref IntPtr optional, ref int optLength,
863                         ref IntPtr refused, ref int refLength);
864
865                 // Support for SecurityAction.RequestMinimum, RequestOptional and RequestRefuse
866                 private void LoadAssemblyPermissions ()
867                 {
868                         IntPtr minimum = IntPtr.Zero, optional = IntPtr.Zero, refused = IntPtr.Zero;
869                         int minLength = 0, optLength = 0, refLength = 0;
870                         if (LoadPermissions (this, ref minimum, ref minLength, ref optional,
871                                 ref optLength, ref refused, ref refLength)) {
872
873                                 // Note: no need to cache these permission sets as they will only be created once
874                                 // at assembly resolution time.
875                                 if (minLength > 0) {
876                                         byte[] data = new byte [minLength];
877                                         Marshal.Copy (minimum, data, 0, minLength);
878                                         _minimum = SecurityManager.Decode (data);
879                                 }
880                                 if (optLength > 0) {
881                                         byte[] data = new byte [optLength];
882                                         Marshal.Copy (optional, data, 0, optLength);
883                                         _optional = SecurityManager.Decode (data);
884                                 }
885                                 if (refLength > 0) {
886                                         byte[] data = new byte [refLength];
887                                         Marshal.Copy (refused, data, 0, refLength);
888                                         _refuse = SecurityManager.Decode (data);
889                                 }
890                         }
891                 }
892 #endif
893                 
894 #if NET_4_0
895                 public virtual PermissionSet PermissionSet {
896                         get { return this.GrantedPermissionSet; }
897                 }
898                 
899                 public virtual SecurityRuleSet SecurityRuleSet {
900                         get { throw CreateNIE (); }
901                 }
902 #endif
903
904 #if NET_4_0 || MOONLIGHT || MOBILE
905                 static Exception CreateNIE ()
906                 {
907                         return new NotImplementedException ("Derived classes must implement it");
908                 }
909                 
910                 public virtual IList<CustomAttributeData> GetCustomAttributesData ()
911                 {
912                         return CustomAttributeData.GetCustomAttributes (this);
913                 }
914
915                 [MonoTODO]
916                 public bool IsFullyTrusted {
917                         get { return true; }
918                 }
919
920                 public virtual Type GetType (string name, bool throwOnError, bool ignoreCase)
921                 {
922                         throw CreateNIE ();
923                 }
924
925                 public virtual Module GetModule (String name)
926                 {
927                         throw CreateNIE ();
928                 }
929
930                 public virtual AssemblyName[] GetReferencedAssemblies ()
931                 {
932                         throw CreateNIE ();
933                 }
934
935                 public virtual Module[] GetModules (bool getResourceModules)
936                 {
937                         throw CreateNIE ();
938                 }
939
940                 [MonoTODO ("Always returns the same as GetModules")]
941                 public virtual Module[] GetLoadedModules (bool getResourceModules)
942                 {
943                         throw CreateNIE ();
944                 }
945
946                 public virtual Assembly GetSatelliteAssembly (CultureInfo culture)
947                 {
948                         throw CreateNIE ();
949                 }
950
951                 public virtual Assembly GetSatelliteAssembly (CultureInfo culture, Version version)
952                 {
953                         throw CreateNIE ();
954                 }
955
956                 public virtual Module ManifestModule {
957                         get { throw CreateNIE (); }
958                 }
959
960                 public virtual bool GlobalAssemblyCache {
961                         get { throw CreateNIE (); }
962                 }
963
964                 public virtual bool IsDynamic {
965                         get { return false; }
966                 }
967
968                 public static bool operator == (Assembly left, Assembly right)
969                 {
970                         if ((object)left == (object)right)
971                                 return true;
972                         if ((object)left == null ^ (object)right == null)
973                                 return false;
974                         return left.Equals (right);
975                 }
976
977                 public static bool operator != (Assembly left, Assembly right)
978                 {
979                         if ((object)left == (object)right)
980                                 return false;
981                         if ((object)left == null ^ (object)right == null)
982                                 return true;
983                         return !left.Equals (right);
984                 }
985 #endif
986         }
987 }