2007-05-11 Jonathan Chambers <joncham@gmail.com>
[mono.git] / mcs / class / corlib / System.Reflection / Module.cs
index 9a1e39e86176d5001a4c080a3b04330bc882d9b0..6c136534127aeb479c74f57eea919b285d050a2e 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System;
-using System.Reflection;
 using System.Runtime.Serialization;
 using System.Security.Cryptography.X509Certificates;
 using System.Runtime.InteropServices;
 using System.Runtime.CompilerServices;
+using System.Security;
 using System.Security.Permissions;
 
 namespace System.Reflection {
@@ -43,8 +42,13 @@ namespace System.Reflection {
                Other
        };
 
+#if NET_2_0
+       [ComVisible (true)]
+       [ComDefaultInterfaceAttribute (typeof (_Module))]
+#endif
        [Serializable]
-       public class Module : ISerializable, ICustomAttributeProvider {
+       [ClassInterfaceAttribute (ClassInterfaceType.None)]
+       public class Module : ISerializable, ICustomAttributeProvider, _Module {
        
                public static readonly TypeFilter FilterTypeName;
                public static readonly TypeFilter FilterTypeNameIgnoreCase;
@@ -73,9 +77,16 @@ namespace System.Reflection {
                }
        
                public virtual string FullyQualifiedName {
-                       get { return fqname; }
+                       get {
+                               if (SecurityManager.SecurityEnabled) {
+                                       new FileIOPermission (FileIOPermissionAccess.PathDiscovery, fqname).Demand ();
+                               }
+                               return fqname;
+                       }
                }
-       
+
+               // Note: we do not ask for PathDiscovery because no path is returned here.
+               // However MS Fx requires it (see FDBK23572 for details).
                public string Name {
                        get { return name; }
                }
@@ -85,7 +96,6 @@ namespace System.Reflection {
                }
 
 #if NET_2_0
-               [CLSCompliant(false)]
                public ModuleHandle ModuleHandle {
                        get {
                                return new ModuleHandle (_impl);
@@ -95,7 +105,12 @@ namespace System.Reflection {
                public extern int MetadataToken {
                        [MethodImplAttribute (MethodImplOptions.InternalCall)]
                        get;
-               }               
+               }
+
+               public extern int MDStreamVersion {
+                       [MethodImplAttribute (MethodImplOptions.InternalCall)]
+                       get;
+               }
 #endif
        
                public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria) 
@@ -147,7 +162,12 @@ namespace System.Reflection {
        
                public MethodInfo GetMethod (string name) 
                {
-                       return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, Type.EmptyTypes, null);
+                       // Can't call the other overloads since they call Type.GetMethod () which does a null check on the 'types' array
+                       if (IsResource ())
+                               return null;
+
+                       Type globalType = GetGlobalType ();
+                       return (globalType != null) ? globalType.GetMethod (name) : null;
                }
        
                public MethodInfo GetMethod (string name, Type[] types) 
@@ -200,6 +220,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.GetModuleData (this, info, context);
                }
        
@@ -212,17 +235,26 @@ namespace System.Reflection {
                                return null;
                        }
                }
-       
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif
                public virtual Type GetType(string className) 
                {
                        return GetType (className, false, false);
                }
-       
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif 
                public virtual Type GetType(string className, bool ignoreCase) 
                {
                        return GetType (className, false, ignoreCase);
                }
        
+#if NET_2_0
+               [ComVisible (true)]
+#endif
                public virtual Type GetType(string className, bool throwOnError, bool ignoreCase) 
                {
                        if (className == null)
@@ -255,17 +287,25 @@ namespace System.Reflection {
                        return name;
                }
 
-#if NET_2_0 || BOOTSTRAP_NET_2_0
-               public
-#else
-               internal
-#endif
-               Guid Mvid {
+               internal Guid MvId {
                        get {
                                return Mono_GetGuid (this);
                        }
                }
 
+#if NET_2_0
+               public Guid ModuleVersionId {
+                       get {
+                               return Mono_GetGuid (this);
+                       }
+               }
+
+               public void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine) {
+                       ModuleHandle.GetPEKind (out peKind, out machine);
+               }
+#endif
+               
+
 #if NET_2_0
                private Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
                        if (error == ResolveTokenError.OutOfRange)
@@ -323,6 +363,11 @@ namespace System.Reflection {
                        else
                                return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
                }
+
+               [MonoTODO]
+               public byte[] ResolveSignature (int metadataToken) {
+                       throw new NotImplementedException ();
+               }
 #endif
 
                internal static Type MonoDebugger_ResolveType (Module module, int token)
@@ -380,6 +425,29 @@ namespace System.Reflection {
                internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, out ResolveTokenError error);
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               internal static extern void GetPEKind (IntPtr module, out PortableExecutableKind peKind, out ImageFileMachine machine);
+               internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
+
+#if NET_1_1
+               void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _Module.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _Module.GetTypeInfoCount (out uint pcTInfo)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               void _Module.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams,
+                       IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
+               {
+                       throw new NotImplementedException ();
+               }
+#endif
        }
 }