[corlib] Fixes build with old UnmanagedMemoryStream
[mono.git] / mcs / class / corlib / System.Reflection / Assembly.cs
index 0805662ad20ea84285711b6209077b180cda458a..c3bb5a3fbf10cd6c2983d638f4e374d6bec8f2ed 100644 (file)
@@ -50,36 +50,59 @@ namespace System.Reflection {
        [ClassInterface(ClassInterfaceType.None)]
        [StructLayout (LayoutKind.Sequential)]
 #if MOBILE
-       public partial class Assembly : ICustomAttributeProvider, _Assembly {
-#elif NET_4_0
-       public abstract class Assembly : ICustomAttributeProvider, _Assembly, IEvidenceFactory, ISerializable {
+       public partial class Assembly : ICustomAttributeProvider {
 #else
-       public partial class Assembly : ICustomAttributeProvider, _Assembly, IEvidenceFactory, ISerializable {
+       public abstract class Assembly : ICustomAttributeProvider, _Assembly, IEvidenceFactory, ISerializable {
 #endif
                internal class ResolveEventHolder {
                        public event ModuleResolveEventHandler ModuleResolve;
                }
 
+               internal class UnmanagedMemoryStreamForModule : UnmanagedMemoryStream
+               {
+                       Module module;
+
+                       public unsafe UnmanagedMemoryStreamForModule (byte* pointer, long length, Module module)
+                               : base (pointer, length)
+                       {
+                               this.module = module;
+                       }
+
+                       protected override void Dispose (bool disposing)
+                       {
+                               if (!closed) {
+                                       /* 
+                                        * The returned pointer points inside metadata, so
+                                        * we have to increase the refcount of the module, and decrease
+                                        * it when the stream is finalized.
+                                        */
+                                       module = null;
+                               }
+
+                               base.Dispose (disposing);
+                       }
+               }
+
                // Note: changes to fields must be reflected in _MonoReflectionAssembly struct (object-internals.h)
 #pragma warning disable 649
                private IntPtr _mono_assembly;
 #pragma warning restore 649
 
                private ResolveEventHolder resolve_event_holder;
+#if !MOBILE
                private Evidence _evidence;
                internal PermissionSet _minimum;        // for SecurityAction.RequestMinimum
                internal PermissionSet _optional;       // for SecurityAction.RequestOptional
                internal PermissionSet _refuse;         // for SecurityAction.RequestRefuse
                private PermissionSet _granted;         // for the resolved assembly granted permissions
                private PermissionSet _denied;          // for the resolved assembly denied permissions
+#else
+               object _evidence, _minimum, _optional, _refuse, _granted, _denied;
+#endif
                private bool fromByteArray;
                private string assemblyName;
 
-#if NET_4_0
                protected
-#else
-               internal
-#endif
                Assembly () 
                {
                        resolve_event_holder = new ResolveEventHolder ();
@@ -203,13 +226,9 @@ namespace System.Reflection {
                        }
                }
 
-               [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
                public virtual void GetObjectData (SerializationInfo info, StreamingContext context)
                {
-                       if (info == null)
-                               throw new ArgumentNullException ("info");
-
-                       UnitySerializationHolder.GetAssemblyData (this, info, context);
+                       throw new NotImplementedException ();
                }
 
                public virtual bool IsDefined (Type attributeType, bool inherit)
@@ -310,14 +329,8 @@ namespace System.Reflection {
                        else {
                                UnmanagedMemoryStream stream;
                                unsafe {
-                                       stream = new UnmanagedMemoryStream ((byte*) data, size);
+                                       stream = new UnmanagedMemoryStreamForModule ((byte*) data, size, module);
                                }
-                               /* 
-                                * The returned pointer points inside metadata, so
-                                * we have to increase the refcount of the module, and decrease
-                                * it when the stream is finalized.
-                                */
-                               stream.Closed += new EventHandler (new ResourceCloseHandler (module).OnClose);
                                return stream;
                        }
                }
@@ -373,10 +386,12 @@ namespace System.Reflection {
                [MonoTODO ("copiedName == true is not supported")]
                public virtual AssemblyName GetName (Boolean copiedName)
                {
+#if !MOBILE
                        // CodeBase, which is restricted, will be copied into the AssemblyName object so...
                        if (SecurityManager.SecurityEnabled) {
                                GetCodeBase (true); // this will ensure the Demand is made
                        }
+#endif
                        return UnprotectedGetName ();
                }
 
@@ -456,12 +471,14 @@ namespace System.Reflection {
                        return LoadFrom (fullName);
                }
 
+#if !MOBILE
                Type _Assembly.GetType ()
                {
                        // Required or object::GetType becomes virtual final
                        return base.GetType ();
                }               
-               
+#endif
+
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern static Assembly LoadFrom (String assemblyFile, bool refonly);
 
@@ -470,9 +487,7 @@ namespace System.Reflection {
                        return LoadFrom (assemblyFile, false);
                }
 
-#if NET_4_0
                [Obsolete]
-#endif
                public static Assembly LoadFrom (String assemblyFile, Evidence securityEvidence)
                {
                        Assembly a = LoadFrom (assemblyFile, false);
@@ -485,9 +500,7 @@ namespace System.Reflection {
                        return a;
                }
 
-#if NET_4_0
                [Obsolete]
-#endif
                [MonoTODO("This overload is not currently implemented")]
                // FIXME: What are we missing?
                public static Assembly LoadFrom (String assemblyFile, Evidence securityEvidence, byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm)
@@ -495,24 +508,18 @@ namespace System.Reflection {
                        throw new NotImplementedException ();
                }
 
-#if NET_4_0
                [MonoTODO]
                public static Assembly LoadFrom (String assemblyFile, byte [] hashValue, AssemblyHashAlgorithm hashAlgorithm)
                {
                        throw new NotImplementedException ();
                }
-#endif
 
-#if NET_4_0
                public static Assembly UnsafeLoadFrom (String assemblyFile)
                {
                        return LoadFrom (assemblyFile);
                }
-#endif
 
-#if NET_4_0
                [Obsolete]
-#endif
                public static Assembly LoadFile (String path, Evidence securityEvidence)
                {
                        if (path == null)
@@ -533,9 +540,7 @@ namespace System.Reflection {
                        return AppDomain.CurrentDomain.Load (assemblyString);
                }
 
-#if NET_4_0
                [Obsolete]
-#endif         
                public static Assembly Load (String assemblyString, Evidence assemblySecurity)
                {
                        return AppDomain.CurrentDomain.Load (assemblyString, assemblySecurity);
@@ -546,9 +551,7 @@ namespace System.Reflection {
                        return AppDomain.CurrentDomain.Load (assemblyRef);
                }
 
-#if NET_4_0
                [Obsolete]
-#endif
                public static Assembly Load (AssemblyName assemblyRef, Evidence assemblySecurity)
                {
                        return AppDomain.CurrentDomain.Load (assemblyRef, assemblySecurity);
@@ -564,22 +567,18 @@ namespace System.Reflection {
                        return AppDomain.CurrentDomain.Load (rawAssembly, rawSymbolStore);
                }
 
-#if NET_4_0
                [Obsolete]
-#endif
                public static Assembly Load (Byte[] rawAssembly, Byte[] rawSymbolStore,
                                             Evidence securityEvidence)
                {
                        return AppDomain.CurrentDomain.Load (rawAssembly, rawSymbolStore, securityEvidence);
                }
 
-#if NET_4_0
                [MonoLimitation ("Argument securityContextSource is ignored")]
                public static Assembly Load (byte [] rawAssembly, byte [] rawSymbolStore, SecurityContextSource securityContextSource)
                {
                        return AppDomain.CurrentDomain.Load (rawAssembly, rawSymbolStore);
                }
-#endif
 
                public static Assembly ReflectionOnlyLoad (byte[] rawAssembly)
                {
@@ -613,9 +612,7 @@ namespace System.Reflection {
 
                [MonoTODO ("Not implemented")]
                public
-#if NET_4_0
                virtual
-#endif
                Module LoadModule (string moduleName, byte [] rawModule, byte [] rawSymbolStore)
                {
                        throw new NotImplementedException ();
@@ -668,9 +665,7 @@ namespace System.Reflection {
                }
 
                public
-#if NET_4_0
                virtual
-#endif
                Object CreateInstance (String typeName, Boolean ignoreCase,
                                              BindingFlags bindingAttr, Binder binder,
                                              Object[] args, CultureInfo culture,
@@ -699,10 +694,6 @@ namespace System.Reflection {
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                internal virtual extern Module[] GetModulesInternal ();
-
-
-               [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               internal extern string[] GetNamespaces ();
                
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                public extern virtual String[] GetManifestResourceNames ();
@@ -733,34 +724,10 @@ namespace System.Reflection {
                                return null;
                }
 
-               private class ResourceCloseHandler {
-#pragma warning disable 169, 414
-                       Module module;
-#pragma warning restore 169, 414                       
-
-                       public ResourceCloseHandler (Module module) {
-                               this.module = module;
-                       }
-
-                       public void OnClose (object sender, EventArgs e) {
-                               // The module dtor will take care of things
-                               module = null;
-                       }
-               }
-
-               //
-               // The following functions are only for the Mono Debugger.
-               //
-
-               [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               internal static extern int MonoDebugger_GetMethodToken (MethodBase method);
-
                [MonoTODO ("Currently it always returns zero")]
                [ComVisible (false)]
                public
-#if NET_4_0
                virtual
-#endif
                long HostContext {
                        get { return 0; }
                }
@@ -878,7 +845,6 @@ namespace System.Reflection {
                        }
                }
                
-#if NET_4_0
                public virtual PermissionSet PermissionSet {
                        get { return this.GrantedPermissionSet; }
                }
@@ -886,11 +852,9 @@ namespace System.Reflection {
                public virtual SecurityRuleSet SecurityRuleSet {
                        get { throw CreateNIE (); }
                }
-#endif
 
 #endif
 
-#if NET_4_0
                static Exception CreateNIE ()
                {
                        return new NotImplementedException ("Derived classes must implement it");
@@ -971,6 +935,25 @@ namespace System.Reflection {
                                return true;
                        return !left.Equals (right);
                }
-#endif
+
+               public virtual IEnumerable<TypeInfo> DefinedTypes {
+                       get {
+                               foreach (var type in GetTypes ()) {
+                                       yield return type.GetTypeInfo ();
+                               }
+                       }
+               }
+
+               public virtual IEnumerable<Type> ExportedTypes {
+                       get { return GetExportedTypes (); }
+               }
+
+               public virtual IEnumerable<Module> Modules {
+                       get { return GetModules (); }
+               }
+
+               public virtual IEnumerable<CustomAttributeData> CustomAttributes {
+                       get { return GetCustomAttributesData (); }
+               }
        }
 }