2 // System.Reflection/Assembly.cs
5 // Paolo Molaro (lupus@ximian.com)
7 // (C) 2001 Ximian, Inc. http://www.ximian.com
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System
.Security
;
31 using System
.Security
.Policy
;
32 using System
.Security
.Permissions
;
33 using System
.Runtime
.Serialization
;
34 using System
.Reflection
;
35 using System
.Reflection
.Emit
;
37 using System
.Globalization
;
38 using System
.Runtime
.CompilerServices
;
39 using System
.Runtime
.InteropServices
;
40 using System
.Collections
;
41 using System
.Collections
.Generic
;
42 using System
.Configuration
.Assemblies
;
46 namespace System
.Reflection
{
48 #pragma warning disable 659 // overrides Equals but not GetHashCode
51 [ComDefaultInterfaceAttribute (typeof (_Assembly
))]
53 [ClassInterface(ClassInterfaceType
.None
)]
55 public partial class Assembly
: ICustomAttributeProvider
, _Assembly
{
57 public abstract class Assembly
: ICustomAttributeProvider
, _Assembly
{
59 public abstract class Assembly
: ICustomAttributeProvider
, _Assembly
, IEvidenceFactory
, ISerializable
{
61 public partial class Assembly
: ICustomAttributeProvider
, _Assembly
, IEvidenceFactory
, ISerializable
{
63 internal class ResolveEventHolder
{
64 public event ModuleResolveEventHandler ModuleResolve
;
67 // Note: changes to fields must be reflected in _MonoReflectionAssembly struct (object-internals.h)
68 #pragma warning disable 649
69 private IntPtr _mono_assembly
;
70 #pragma warning restore 649
72 private ResolveEventHolder resolve_event_holder
;
73 private Evidence _evidence
;
74 internal PermissionSet _minimum
; // for SecurityAction.RequestMinimum
75 internal PermissionSet _optional
; // for SecurityAction.RequestOptional
76 internal PermissionSet _refuse
; // for SecurityAction.RequestRefuse
77 private PermissionSet _granted
; // for the resolved assembly granted permissions
78 private PermissionSet _denied
; // for the resolved assembly denied permissions
79 private bool fromByteArray
;
80 private string assemblyName
;
82 #if NET_4_0 || MOONLIGHT
89 resolve_event_holder
= new ResolveEventHolder ();
93 // We can't store the event directly in this class, since the
94 // compiler would silently insert the fields before _mono_assembly
96 public event ModuleResolveEventHandler ModuleResolve
{
97 [SecurityPermission (SecurityAction
.LinkDemand
, ControlAppDomain
= true)]
99 resolve_event_holder
.ModuleResolve
+= value;
101 [SecurityPermission (SecurityAction
.LinkDemand
, ControlAppDomain
= true)]
103 resolve_event_holder
.ModuleResolve
-= value;
107 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
108 private extern string get_code_base (bool escaped
);
110 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
111 private extern string get_fullname ();
113 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
114 private extern string get_location ();
116 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
117 private extern string InternalImageRuntimeVersion ();
119 // SECURITY: this should be the only caller to icall get_code_base
120 private string GetCodeBase (bool escaped
)
122 string cb
= get_code_base (escaped
);
124 if (SecurityManager
.SecurityEnabled
) {
125 // we cannot divulge local file informations
126 if (String
.Compare ("FILE://", 0, cb
, 0, 7, true, CultureInfo
.InvariantCulture
) == 0) {
127 string file
= cb
.Substring (7);
128 new FileIOPermission (FileIOPermissionAccess
.PathDiscovery
, file
).Demand ();
135 public virtual string CodeBase
{
136 get { return GetCodeBase (false); }
139 public virtual string EscapedCodeBase
{
140 get { return GetCodeBase (true); }
143 public virtual string FullName
{
146 // FIXME: This is wrong, but it gets us going
147 // in the compiler for now
153 public virtual extern MethodInfo EntryPoint
{
154 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
158 public virtual Evidence Evidence
{
159 [SecurityPermission (SecurityAction
.Demand
, ControlEvidence
= true)]
160 get { return UnprotectedGetEvidence (); }
163 // note: the security runtime requires evidences but may be unable to do so...
164 internal Evidence
UnprotectedGetEvidence ()
166 // if the host (runtime) hasn't provided it's own evidence...
167 if (_evidence
== null) {
168 // ... we will provide our own
170 _evidence
= Evidence
.GetDefaultHostEvidence (this);
176 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
177 internal extern bool get_global_assembly_cache ();
180 internal bool FromByteArray
{
181 set { fromByteArray = value; }
184 public virtual String Location
{
189 string loc
= get_location ();
191 if ((loc
!= String
.Empty
) && SecurityManager
.SecurityEnabled
) {
192 // we cannot divulge local file informations
193 new FileIOPermission (FileIOPermissionAccess
.PathDiscovery
, loc
).Demand ();
201 public virtual string ImageRuntimeVersion
{
203 return InternalImageRuntimeVersion ();
207 [SecurityPermission (SecurityAction
.LinkDemand
, SerializationFormatter
= true)]
208 public virtual void GetObjectData (SerializationInfo info
, StreamingContext context
)
211 throw new ArgumentNullException ("info");
213 UnitySerializationHolder
.GetAssemblyData (this, info
, context
);
216 public virtual bool IsDefined (Type attributeType
, bool inherit
)
218 return MonoCustomAttrs
.IsDefined (this, attributeType
, inherit
);
221 public virtual object [] GetCustomAttributes (bool inherit
)
223 return MonoCustomAttrs
.GetCustomAttributes (this, inherit
);
226 public virtual object [] GetCustomAttributes (Type attributeType
, bool inherit
)
228 return MonoCustomAttrs
.GetCustomAttributes (this, attributeType
, inherit
);
231 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
232 private extern object GetFilesInternal (String name
, bool getResourceModules
);
234 public virtual FileStream
[] GetFiles ()
236 return GetFiles (false);
239 public virtual FileStream
[] GetFiles (bool getResourceModules
)
241 string[] names
= (string[]) GetFilesInternal (null, getResourceModules
);
243 return new FileStream
[0];
245 string location
= Location
;
248 if (location
!= String
.Empty
) {
249 res
= new FileStream
[names
.Length
+ 1];
250 res
[0] = new FileStream (location
, FileMode
.Open
, FileAccess
.Read
);
251 for (int i
= 0; i
< names
.Length
; ++i
)
252 res
[i
+ 1] = new FileStream (names
[i
], FileMode
.Open
, FileAccess
.Read
);
254 res
= new FileStream
[names
.Length
];
255 for (int i
= 0; i
< names
.Length
; ++i
)
256 res
[i
] = new FileStream (names
[i
], FileMode
.Open
, FileAccess
.Read
);
261 public virtual FileStream
GetFile (String name
)
264 throw new ArgumentNullException (null, "Name cannot be null.");
265 if (name
.Length
== 0)
266 throw new ArgumentException ("Empty name is not valid");
268 string filename
= (string)GetFilesInternal (name
, true);
269 if (filename
!= null)
270 return new FileStream (filename
, FileMode
.Open
, FileAccess
.Read
);
275 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
276 internal extern IntPtr
GetManifestResourceInternal (String name
, out int size
, out Module module
);
278 public virtual Stream
GetManifestResourceStream (String name
)
281 throw new ArgumentNullException ("name");
282 if (name
.Length
== 0)
283 throw new ArgumentException ("String cannot have zero length.",
286 ManifestResourceInfo info
= GetManifestResourceInfo (name
);
290 if (info
.ReferencedAssembly
!= null)
291 return info
.ReferencedAssembly
.GetManifestResourceStream (name
);
292 if ((info
.FileName
!= null) && (info
.ResourceLocation
== 0)) {
294 throw new FileNotFoundException (info
.FileName
);
296 string location
= Path
.GetDirectoryName (Location
);
297 string filename
= Path
.Combine (location
, info
.FileName
);
299 // we don't control the content of 'info.FileName' so we want to make sure we keep to ourselves
300 filename
= Path
.GetFullPath (filename
);
301 if (!filename
.StartsWith (location
))
302 throw new SecurityException ("non-rooted access to manifest resource");
304 return new FileStream (filename
, FileMode
.Open
, FileAccess
.Read
);
309 IntPtr data
= GetManifestResourceInternal (name
, out size
, out module
);
310 if (data
== (IntPtr
) 0)
313 UnmanagedMemoryStream stream
;
315 stream
= new UnmanagedMemoryStream ((byte*) data
, size
);
318 * The returned pointer points inside metadata, so
319 * we have to increase the refcount of the module, and decrease
320 * it when the stream is finalized.
322 stream
.Closed
+= new EventHandler (new ResourceCloseHandler (module
).OnClose
);
327 public virtual Stream
GetManifestResourceStream (Type type
, String name
)
334 throw new ArgumentNullException ("type");
338 if (ns
== null || ns
.Length
== 0)
339 return GetManifestResourceStream (name
);
341 return GetManifestResourceStream (ns
+ "." + name
);
344 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
345 internal virtual extern Type
[] GetTypes (bool exportedOnly
);
347 public virtual Type
[] GetTypes ()
349 return GetTypes (false);
352 public virtual Type
[] GetExportedTypes ()
354 return GetTypes (true);
357 public virtual Type
GetType (String name
, Boolean throwOnError
)
359 return GetType (name
, throwOnError
, false);
362 public virtual Type
GetType (String name
) {
363 return GetType (name
, false, false);
366 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
367 internal extern Type
InternalGetType (Module module
, String name
, Boolean throwOnError
, Boolean ignoreCase
);
369 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
370 internal extern static void InternalGetAssemblyName (string assemblyFile
, AssemblyName aname
);
372 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
373 static extern void FillName (Assembly ass
, AssemblyName aname
);
375 [MonoTODO ("copiedName == true is not supported")]
376 public virtual AssemblyName
GetName (Boolean copiedName
)
378 // CodeBase, which is restricted, will be copied into the AssemblyName object so...
379 if (SecurityManager
.SecurityEnabled
) {
380 GetCodeBase (true); // this will ensure the Demand is made
382 return UnprotectedGetName ();
385 public virtual AssemblyName
GetName ()
387 return GetName (false);
390 // the security runtime requires access to the assemblyname (e.g. to get the strongname)
391 internal virtual AssemblyName
UnprotectedGetName ()
393 AssemblyName aname
= new AssemblyName ();
394 FillName (this, aname
);
398 public override string ToString ()
400 // note: ToString work without requiring CodeBase (so no checks are needed)
402 if (assemblyName
!= null)
405 assemblyName
= get_fullname ();
409 public static String
CreateQualifiedName (String assemblyName
, String typeName
)
411 return typeName
+ ", " + assemblyName
;
414 public static Assembly
GetAssembly (Type type
)
417 return type
.Assembly
;
418 throw new ArgumentNullException ("type");
422 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
423 public static extern Assembly
GetEntryAssembly();
425 internal Assembly
GetSatelliteAssemblyNoThrow (CultureInfo culture
, Version version
)
427 return GetSatelliteAssembly (culture
, version
, false);
430 internal Assembly
GetSatelliteAssembly (CultureInfo culture
, Version version
, bool throwOnError
)
433 throw new ArgumentException ("culture");
435 AssemblyName aname
= GetName (true);
437 aname
.Version
= version
;
439 aname
.CultureInfo
= culture
;
440 aname
.Name
= aname
.Name
+ ".resources";
444 assembly
= AppDomain
.CurrentDomain
.LoadSatellite (aname
, false);
445 if (assembly
!= null)
447 } catch (FileNotFoundException
) {
452 // Try the assembly directory
453 string location
= Path
.GetDirectoryName (Location
);
454 string fullName
= Path
.Combine (location
, Path
.Combine (culture
.Name
, aname
.Name
+ ".dll"));
456 // it's unlikely that culture.Name or aname.Name could contain stuff like ".." but...
457 fullName
= Path
.GetFullPath (fullName
);
458 if (!fullName
.StartsWith (location
)) {
460 throw new SecurityException ("non-rooted access to satellite assembly");
464 if (!throwOnError
&& !File
.Exists (fullName
))
467 return LoadFrom (fullName
);
470 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
471 private extern static Assembly
LoadFrom (String assemblyFile
, bool refonly
);
473 public static Assembly
LoadFrom (String assemblyFile
)
475 return LoadFrom (assemblyFile
, false);
481 public static Assembly
LoadFrom (String assemblyFile
, Evidence securityEvidence
)
483 Assembly a
= LoadFrom (assemblyFile
, false);
485 if ((a
!= null) && (securityEvidence
!= null)) {
486 // merge evidence (i.e. replace defaults with provided evidences)
487 a
.Evidence
.Merge (securityEvidence
);
496 [MonoTODO("This overload is not currently implemented")]
497 // FIXME: What are we missing?
498 public static Assembly
LoadFrom (String assemblyFile
, Evidence securityEvidence
, byte[] hashValue
, AssemblyHashAlgorithm hashAlgorithm
)
500 throw new NotImplementedException ();
505 public static Assembly
LoadFrom (String assemblyFile
, byte [] hashValue
, AssemblyHashAlgorithm hashAlgorithm
)
507 throw new NotImplementedException ();
514 public static Assembly
LoadFile (String path
, Evidence securityEvidence
)
517 throw new ArgumentNullException ("path");
518 if (path
== String
.Empty
)
519 throw new ArgumentException ("Path can't be empty", "path");
520 // FIXME: Make this do the right thing
521 return LoadFrom (path
, securityEvidence
);
524 public static Assembly
LoadFile (String path
)
526 return LoadFile (path
, null);
529 public static Assembly
Load (String assemblyString
)
531 return AppDomain
.CurrentDomain
.Load (assemblyString
);
537 public static Assembly
Load (String assemblyString
, Evidence assemblySecurity
)
539 return AppDomain
.CurrentDomain
.Load (assemblyString
, assemblySecurity
);
542 public static Assembly
Load (AssemblyName assemblyRef
)
544 return AppDomain
.CurrentDomain
.Load (assemblyRef
);
550 public static Assembly
Load (AssemblyName assemblyRef
, Evidence assemblySecurity
)
552 return AppDomain
.CurrentDomain
.Load (assemblyRef
, assemblySecurity
);
555 public static Assembly
Load (Byte
[] rawAssembly
)
557 return AppDomain
.CurrentDomain
.Load (rawAssembly
);
560 public static Assembly
Load (Byte
[] rawAssembly
, Byte
[] rawSymbolStore
)
562 return AppDomain
.CurrentDomain
.Load (rawAssembly
, rawSymbolStore
);
568 public static Assembly
Load (Byte
[] rawAssembly
, Byte
[] rawSymbolStore
,
569 Evidence securityEvidence
)
571 return AppDomain
.CurrentDomain
.Load (rawAssembly
, rawSymbolStore
, securityEvidence
);
575 [MonoLimitation ("Argument securityContextSource is ignored")]
576 public static Assembly
Load (byte [] rawAssembly
, byte [] rawSymbolStore
, SecurityContextSource securityContextSource
)
578 return AppDomain
.CurrentDomain
.Load (rawAssembly
, rawSymbolStore
);
582 public static Assembly
ReflectionOnlyLoad (byte[] rawAssembly
)
584 return AppDomain
.CurrentDomain
.Load (rawAssembly
, null, null, true);
587 public static Assembly
ReflectionOnlyLoad (string assemblyString
)
589 return AppDomain
.CurrentDomain
.Load (assemblyString
, null, true);
592 public static Assembly
ReflectionOnlyLoadFrom (string assemblyFile
)
594 if (assemblyFile
== null)
595 throw new ArgumentNullException ("assemblyFile");
597 return LoadFrom (assemblyFile
, true);
603 public static Assembly
LoadWithPartialName (string partialName
)
605 return LoadWithPartialName (partialName
, null);
608 [MonoTODO ("Not implemented")]
609 public Module
LoadModule (string moduleName
, byte [] rawModule
)
611 throw new NotImplementedException ();
614 [MonoTODO ("Not implemented")]
616 #if NET_4_0 || MOONLIGHT
619 Module
LoadModule (string moduleName
, byte [] rawModule
, byte [] rawSymbolStore
)
621 throw new NotImplementedException ();
624 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
625 private static extern Assembly
load_with_partial_name (string name
, Evidence e
);
630 public static Assembly
LoadWithPartialName (string partialName
, Evidence securityEvidence
)
632 return LoadWithPartialName (partialName
, securityEvidence
, true);
636 * LAMESPEC: It is possible for this method to throw exceptions IF the name supplied
637 * is a valid gac name and contains filesystem entry charachters at the end of the name
638 * ie System/// will throw an exception. However ////System will not as that is canocolized
642 // FIXME: LoadWithPartialName must look cache (no CAS) or read from disk (CAS)
643 internal static Assembly
LoadWithPartialName (string partialName
, Evidence securityEvidence
, bool oldBehavior
)
646 throw new NotImplementedException ();
648 if (partialName
== null)
649 throw new NullReferenceException ();
651 return load_with_partial_name (partialName
, securityEvidence
);
654 public Object
CreateInstance (String typeName
)
656 return CreateInstance (typeName
, false);
659 public Object
CreateInstance (String typeName
, Boolean ignoreCase
)
661 Type t
= GetType (typeName
, false, ignoreCase
);
666 return Activator
.CreateInstance (t
);
667 } catch (InvalidOperationException
) {
668 throw new ArgumentException ("It is illegal to invoke a method on a Type loaded via ReflectionOnly methods.");
673 #if NET_4_0 || MOONLIGHT
676 Object
CreateInstance (String typeName
, Boolean ignoreCase
,
677 BindingFlags bindingAttr
, Binder binder
,
678 Object
[] args
, CultureInfo culture
,
679 Object
[] activationAttributes
)
681 Type t
= GetType (typeName
, false, ignoreCase
);
686 return Activator
.CreateInstance (t
, bindingAttr
, binder
, args
, culture
, activationAttributes
);
687 } catch (InvalidOperationException
) {
688 throw new ArgumentException ("It is illegal to invoke a method on a Type loaded via ReflectionOnly methods.");
692 public Module
[] GetLoadedModules ()
694 return GetLoadedModules (false);
697 public Module
[] GetModules ()
699 return GetModules (false);
702 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
703 internal virtual extern Module
[] GetModulesInternal ();
706 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
707 internal extern string[] GetNamespaces ();
709 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
710 public extern virtual String
[] GetManifestResourceNames ();
712 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
713 public extern static Assembly
GetExecutingAssembly ();
715 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
716 public extern static Assembly
GetCallingAssembly ();
718 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
719 internal static extern AssemblyName
[] GetReferencedAssemblies (Assembly module
);
721 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
722 private extern bool GetManifestResourceInfoInternal (String name
, ManifestResourceInfo info
);
724 public virtual ManifestResourceInfo
GetManifestResourceInfo (String resourceName
)
726 if (resourceName
== null)
727 throw new ArgumentNullException ("resourceName");
728 if (resourceName
.Length
== 0)
729 throw new ArgumentException ("String cannot have zero length.");
730 ManifestResourceInfo result
= new ManifestResourceInfo ();
731 bool found
= GetManifestResourceInfoInternal (resourceName
, result
);
738 private class ResourceCloseHandler
{
739 #pragma warning disable 169, 414
741 #pragma warning restore 169, 414
743 public ResourceCloseHandler (Module module
) {
744 this.module
= module
;
747 public void OnClose (object sender
, EventArgs e
) {
748 // The module dtor will take care of things
754 // The following functions are only for the Mono Debugger.
757 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
758 internal static extern int MonoDebugger_GetMethodToken (MethodBase method
);
760 [MonoTODO ("Currently it always returns zero")]
763 #if NET_4_0 || MOONLIGHT
771 internal virtual Module
GetManifestModule () {
772 return GetManifestModuleInternal ();
775 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
776 internal extern Module
GetManifestModuleInternal ();
779 public virtual extern bool ReflectionOnly
{
780 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
784 public override bool Equals (object o
)
786 if (((object) this) == o
)
792 Assembly other
= (Assembly
) o
;
793 return other
._mono_assembly
== _mono_assembly
;
798 public virtual IList
<CustomAttributeData
> GetCustomAttributesData () {
799 return CustomAttributeData
.GetCustomAttributes (this);
802 public PermissionSet PermissionSet
{
803 get { return this.GrantedPermissionSet; }
808 // Code Access Security
810 internal void Resolve ()
813 // FIXME: As we (currently) delay the resolution until the first CAS
814 // Demand it's too late to evaluate the Minimum permission set as a
815 // condition to load the assembly into the AppDomain
816 LoadAssemblyPermissions ();
817 Evidence e
= new Evidence (UnprotectedGetEvidence ()); // we need a copy to add PRE
818 e
.AddHost (new PermissionRequestEvidence (_minimum
, _optional
, _refuse
));
819 _granted
= SecurityManager
.ResolvePolicy (e
,
820 _minimum
, _optional
, _refuse
, out _denied
);
824 internal PermissionSet GrantedPermissionSet
{
826 if (_granted
== null) {
827 if (SecurityManager
.ResolvingPolicyLevel
!= null) {
828 if (SecurityManager
.ResolvingPolicyLevel
.IsFullTrustAssembly (this))
829 return DefaultPolicies
.FullTrust
;
831 return null; // we can't resolve during resolution
839 internal PermissionSet DeniedPermissionSet
{
841 // yes we look for granted, as denied may be null
842 if (_granted
== null) {
843 if (SecurityManager
.ResolvingPolicyLevel
!= null) {
844 if (SecurityManager
.ResolvingPolicyLevel
.IsFullTrustAssembly (this))
847 return DefaultPolicies
.FullTrust
; // deny unrestricted
855 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
856 extern internal static bool LoadPermissions (Assembly a
,
857 ref IntPtr minimum
, ref int minLength
,
858 ref IntPtr optional
, ref int optLength
,
859 ref IntPtr refused
, ref int refLength
);
861 // Support for SecurityAction.RequestMinimum, RequestOptional and RequestRefuse
862 private void LoadAssemblyPermissions ()
864 IntPtr minimum
= IntPtr
.Zero
, optional
= IntPtr
.Zero
, refused
= IntPtr
.Zero
;
865 int minLength
= 0, optLength
= 0, refLength
= 0;
866 if (LoadPermissions (this, ref minimum
, ref minLength
, ref optional
,
867 ref optLength
, ref refused
, ref refLength
)) {
869 // Note: no need to cache these permission sets as they will only be created once
870 // at assembly resolution time.
872 byte[] data
= new byte [minLength
];
873 Marshal
.Copy (minimum
, data
, 0, minLength
);
874 _minimum
= SecurityManager
.Decode (data
);
877 byte[] data
= new byte [optLength
];
878 Marshal
.Copy (optional
, data
, 0, optLength
);
879 _optional
= SecurityManager
.Decode (data
);
882 byte[] data
= new byte [refLength
];
883 Marshal
.Copy (refused
, data
, 0, refLength
);
884 _refuse
= SecurityManager
.Decode (data
);
890 #if NET_4_0 || MOONLIGHT
891 static Exception
CreateNIE ()
893 return new NotImplementedException ("Derived classes must implement it");
896 public virtual Type
GetType (string name
, bool throwOnError
, bool ignoreCase
)
901 public virtual Module
GetModule (String name
)
906 public virtual AssemblyName
[] GetReferencedAssemblies ()
911 public virtual Module
[] GetModules (bool getResourceModules
)
916 [MonoTODO ("Always returns the same as GetModules")]
917 public virtual Module
[] GetLoadedModules (bool getResourceModules
)
922 public virtual Assembly
GetSatelliteAssembly (CultureInfo culture
)
927 public virtual Assembly
GetSatelliteAssembly (CultureInfo culture
, Version version
)
932 public virtual Module ManifestModule
{
933 get { throw CreateNIE (); }
936 public virtual bool GlobalAssemblyCache
{
937 get { throw CreateNIE (); }
940 public virtual bool IsDynamic
{
941 get { return false; }
944 public override int GetHashCode ()
946 return base.GetHashCode ();
949 public static bool operator == (Assembly left
, Assembly right
)
951 if ((object)left
== (object)right
)
953 if ((object)left
== null ^
(object)right
== null)
955 return left
.Equals (right
);
958 public static bool operator != (Assembly left
, Assembly right
)
960 if ((object)left
== (object)right
)
962 if ((object)left
== null ^
(object)right
== null)
964 return !left
.Equals (right
);
970 #pragma warning restore 659