X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Reflection%2FModule.cs;h=c2477878a6757f1cf74a77e1c3a623b3e5f0dfe1;hb=438e3b5ac335f69a620d2db738626fca1d0c2980;hp=b1f961a735cfbd3df7a3d866736b34f2a7ed6120;hpb=f0097fdd0a8d3ae60c3b3b6672c771ee61173be1;p=mono.git diff --git a/mcs/class/corlib/System.Reflection/Module.cs b/mcs/class/corlib/System.Reflection/Module.cs index b1f961a735c..75bfc1fc74b 100644 --- a/mcs/class/corlib/System.Reflection/Module.cs +++ b/mcs/class/corlib/System.Reflection/Module.cs @@ -33,6 +33,7 @@ using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; +using System.Collections.Generic; namespace System.Reflection { @@ -42,386 +43,220 @@ namespace System.Reflection { Other }; -#if NET_2_0 [ComVisible (true)] [ComDefaultInterfaceAttribute (typeof (_Module))] -#endif [Serializable] [ClassInterfaceAttribute (ClassInterfaceType.None)] - public class Module : ISerializable, ICustomAttributeProvider, _Module { - - public static readonly TypeFilter FilterTypeName; - public static readonly TypeFilter FilterTypeNameIgnoreCase; + [StructLayout (LayoutKind.Sequential)] +#if MOBILE + public abstract class Module : ISerializable, ICustomAttributeProvider { +#else + public abstract class Module : ISerializable, ICustomAttributeProvider, _Module { +#endif + public static readonly TypeFilter FilterTypeName = new TypeFilter (filter_by_type_name); + public static readonly TypeFilter FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case); - private IntPtr _impl; /* a pointer to a MonoImage */ +#pragma warning disable 649 + internal IntPtr _impl; /* a pointer to a MonoImage */ internal Assembly assembly; internal string fqname; internal string name; internal string scopename; internal bool is_resource; internal int token; +#pragma warning restore 649 const BindingFlags defaultBindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; - - static Module () { - FilterTypeName = new TypeFilter (filter_by_type_name); - FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case); - } - internal Module () { + protected + Module () { } - public Assembly Assembly { - get { return assembly; } - } - - public virtual string FullyQualifiedName { - 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; } - } - - public string ScopeName { - get { return scopename; } - } - -#if NET_2_0 public ModuleHandle ModuleHandle { get { return new ModuleHandle (_impl); } } - public extern int MetadataToken { - [MethodImplAttribute (MethodImplOptions.InternalCall)] - get; - } -#endif - - public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria) - { - System.Collections.ArrayList filtered = new System.Collections.ArrayList (); - Type[] types = GetTypes (); - foreach (Type t in types) - if (filter (t, filterCriteria)) - filtered.Add (t); - return (Type[])filtered.ToArray (typeof(Type)); - } - - public virtual object[] GetCustomAttributes(bool inherit) - { - return MonoCustomAttrs.GetCustomAttributes (this, inherit); - } - - public virtual object[] GetCustomAttributes(Type attributeType, bool inherit) - { - return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit); - } - + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal static extern int get_MetadataToken (Module module); + + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal static extern int GetMDStreamVersion (IntPtr module_handle); + public FieldInfo GetField (string name) { - if (IsResource ()) - return null; - - Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetField (name, BindingFlags.Public | BindingFlags.Static) : null; + return GetField (name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); } - - public FieldInfo GetField (string name, BindingFlags flags) - { - if (IsResource ()) - return null; - Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetField (name, flags) : null; - } - public FieldInfo[] GetFields () { - if (IsResource ()) - return new FieldInfo [0]; - - Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetFields (BindingFlags.Public | BindingFlags.Static) : new FieldInfo [0]; + return GetFields (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); } public MethodInfo GetMethod (string name) { - return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, Type.EmptyTypes, null); + return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, null, null); } public MethodInfo GetMethod (string name, Type[] types) { + if (types == null) + throw new ArgumentNullException ("types"); return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, types, null); } public MethodInfo GetMethod (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) { + if (types == null) + throw new ArgumentNullException ("types"); return GetMethodImpl (name, bindingAttr, binder, callConvention, types, modifiers); } - protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) - { - if (IsResource ()) - return null; - - Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetMethod (name, bindingAttr, binder, callConvention, types, modifiers) : null; - } - public MethodInfo[] GetMethods () { - if (IsResource ()) - return new MethodInfo [0]; - - Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetMethods () : new MethodInfo [0]; - } - -#if NET_2_0 - public MethodInfo[] GetMethods (BindingFlags flags) { - if (IsResource ()) - return new MethodInfo [0]; - - Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetMethods (flags) : new MethodInfo [0]; - } - - public FieldInfo[] GetFields (BindingFlags flags) - { - if (IsResource ()) - return new FieldInfo [0]; - - Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetFields (flags) : new FieldInfo [0]; + return GetMethods (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); } -#endif [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); - } - - public X509Certificate GetSignerCertificate () - { - try { - return X509Certificate.CreateFromSignedFile (assembly.Location); - } - catch { - return null; - } + throw new NotImplementedException (); } -#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) - throw new ArgumentNullException ("className"); - if (className == String.Empty) - throw new ArgumentException ("Type name can't be empty"); - return assembly.InternalGetType (this, className, throwOnError, ignoreCase); - } - [MethodImplAttribute (MethodImplOptions.InternalCall)] - private extern Type[] InternalGetTypes (); - - public virtual Type[] GetTypes() - { - return InternalGetTypes (); - } - - public virtual bool IsDefined (Type attributeType, bool inherit) - { - return MonoCustomAttrs.IsDefined (this, attributeType, inherit); - } - - public bool IsResource() - { - return is_resource; - } + internal extern Type[] InternalGetTypes (); public override string ToString () { return name; } -#if NET_2_0 - [Obsolete ("Please use ModuleVersionId instead - this will be removed before Whidbey ships.")] - public -#else - internal -#endif - Guid MvId { + internal Guid MvId { get { - return Mono_GetGuid (this); + return GetModuleVersionId (); } } -#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) { + internal Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) { if (error == ResolveTokenError.OutOfRange) return new ArgumentOutOfRangeException ("metadataToken", String.Format ("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name)); else return new ArgumentException (String.Format ("Token 0x{0:x} is not a valid {1} token in the scope of module {2}", metadataToken, tokenType, name), "metadataToken"); } - [Obsolete ("Please use ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) - this will be removed before Whidbey ships.")] - public FieldInfo ResolveField (int metadataToken) { - ResolveTokenError error; + internal IntPtr[] ptrs_from_types (Type[] types) { + if (types == null) + return null; + else { + IntPtr[] res = new IntPtr [types.Length]; + for (int i = 0; i < types.Length; ++i) { + if (types [i] == null) + throw new ArgumentException (); + res [i] = types [i].TypeHandle.Value; + } + return res; + } + } - IntPtr handle = ResolveFieldToken (_impl, metadataToken, out error); - if (handle == IntPtr.Zero) - throw resolve_token_exception (metadataToken, error, "Field"); - else - return FieldInfo.GetFieldFromHandle (new RuntimeFieldHandle (handle)); + public FieldInfo ResolveField (int metadataToken) { + return ResolveField (metadataToken, null, null); } public MemberInfo ResolveMember (int metadataToken) { - ResolveTokenError error; - - MemberInfo m = ResolveMemberToken (_impl, metadataToken, out error); - if (m == null) - throw resolve_token_exception (metadataToken, error, "MemberInfo"); - else - return m; + return ResolveMember (metadataToken, null, null); } - [Obsolete ("Please use ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) - this will be removed before Whidbey ships.")] public MethodBase ResolveMethod (int metadataToken) { - ResolveTokenError error; - - IntPtr handle = ResolveMethodToken (_impl, metadataToken, out error); - if (handle == IntPtr.Zero) - throw resolve_token_exception (metadataToken, error, "MethodBase"); - else - return MethodBase.GetMethodFromHandle (new RuntimeMethodHandle (handle)); + return ResolveMethod (metadataToken, null, null); } - public string ResolveString (int metadataToken) { - ResolveTokenError error; - - string s = ResolveStringToken (_impl, metadataToken, out error); - if (s == null) - throw resolve_token_exception (metadataToken, error, "string"); - else - return s; - } - - [Obsolete ("Please use ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) - this will be removed before Whidbey ships.")] public Type ResolveType (int metadataToken) { - ResolveTokenError error; - - IntPtr handle = ResolveTypeToken (_impl, metadataToken, out error); - if (handle == IntPtr.Zero) - throw resolve_token_exception (metadataToken, error, "Type"); - else - return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle)); + return ResolveType (metadataToken, null, null); } -#endif internal static Type MonoDebugger_ResolveType (Module module, int token) { ResolveTokenError error; - IntPtr handle = ResolveTypeToken (module._impl, token, out error); + IntPtr handle = ResolveTypeToken (module._impl, token, null, null, out error); if (handle == IntPtr.Zero) return null; else return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle)); } - // Mono Extension: returns the GUID of this module + // Used by mcs, the symbol writer, and mdb through reflection internal static Guid Mono_GetGuid (Module module) { - return new Guid (module.GetGuidInternal ()); + return module.GetModuleVersionId (); + } + + internal virtual Guid GetModuleVersionId () + { + return new Guid (GetGuidInternal ()); } private static bool filter_by_type_name (Type m, object filterCriteria) { string s = (string)filterCriteria; - if (s.EndsWith ("*")) - return m.Name.StartsWith (s.Substring (0, s.Length - 1)); - else - return m.Name == s; + if (s.Length > 0 && s [s.Length - 1] == '*') + return m.Name.StartsWithOrdinalUnchecked (s.Substring (0, s.Length - 1)); + + return m.Name == s; } private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) { string s = (string)filterCriteria; - if (s.EndsWith ("*")) - return m.Name.ToLower ().StartsWith (s.Substring (0, s.Length - 1).ToLower ()); - else - return String.Compare (m.Name, s, true) == 0; + if (s.Length > 0 && s [s.Length - 1] == '*') + return m.Name.StartsWith (s.Substring (0, s.Length - 1), StringComparison.OrdinalIgnoreCase); + + return string.Compare (m.Name, s, StringComparison.OrdinalIgnoreCase) == 0; } + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal extern IntPtr GetHINSTANCE (); + [MethodImplAttribute (MethodImplOptions.InternalCall)] private extern string GetGuidInternal (); [MethodImplAttribute (MethodImplOptions.InternalCall)] - private extern Type GetGlobalType (); + internal extern Type GetGlobalType (); [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, out ResolveTokenError error); + internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, out ResolveTokenError error); + internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, out ResolveTokenError error); + internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] internal static extern string ResolveStringToken (IntPtr module, int token, out ResolveTokenError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] - internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, out ResolveTokenError error); + internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error); + + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal static extern byte[] ResolveSignature (IntPtr module, int metadataToken, out ResolveTokenError error); [MethodImplAttribute (MethodImplOptions.InternalCall)] internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine); -#if NET_1_1 +#if !MOBILE void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId) { throw new NotImplementedException (); @@ -443,5 +278,173 @@ namespace System.Reflection { throw new NotImplementedException (); } #endif + + public override bool Equals (object o) + { + return o == (object) this; + } + + public override int GetHashCode () + { + return base.GetHashCode (); + } + + public static bool operator == (Module left, Module right) + { + if ((object)left == (object)right) + return true; + if ((object)left == null ^ (object)right == null) + return false; + return left.Equals (right); + } + + public static bool operator != (Module left, Module right) + { + if ((object)left == (object)right) + return false; + if ((object)left == null ^ (object)right == null) + return true; + return !left.Equals (right); + } + + + + public virtual Assembly Assembly { + get { throw CreateNIE (); } + } + + public virtual string Name { + get { throw CreateNIE (); } + } + + public virtual string ScopeName { + get { throw CreateNIE (); } + } + + public virtual int MDStreamVersion { + get { throw CreateNIE (); } + } + + public virtual Guid ModuleVersionId { + get { throw CreateNIE (); } + } + + public virtual string FullyQualifiedName { + get { throw CreateNIE (); } + } + + public virtual int MetadataToken { + get { throw CreateNIE (); } + } + + static Exception CreateNIE () + { + return new NotImplementedException ("Derived classes must implement it"); + } + + public virtual bool IsResource() + { + throw CreateNIE (); + } + + public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria) + { + throw CreateNIE (); + } + + public virtual object[] GetCustomAttributes(bool inherit) + { + throw CreateNIE (); + } + + public virtual object[] GetCustomAttributes(Type attributeType, bool inherit) + { + throw CreateNIE (); + } + + public virtual IList GetCustomAttributesData () + { + throw CreateNIE (); + } + + public virtual FieldInfo GetField (string name, BindingFlags bindingAttr) + { + throw CreateNIE (); + } + + public virtual FieldInfo[] GetFields (BindingFlags bindingFlags) + { + throw CreateNIE (); + } + + protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) + { + throw CreateNIE (); + } + + public virtual MethodInfo[] GetMethods (BindingFlags bindingFlags) + { + throw CreateNIE (); + } + + public virtual void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine) + { + throw CreateNIE (); + } + + [ComVisible (true)] + public virtual Type GetType(string className, bool throwOnError, bool ignoreCase) + { + throw CreateNIE (); + } + + public virtual bool IsDefined (Type attributeType, bool inherit) + { + throw CreateNIE (); + } + + public virtual FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) + { + throw CreateNIE (); + } + + public virtual MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) + { + throw CreateNIE (); + } + + public virtual MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) + { + throw CreateNIE (); + } + + public virtual byte[] ResolveSignature (int metadataToken) + { + throw CreateNIE (); + } + + public virtual string ResolveString (int metadataToken) + { + throw CreateNIE (); + } + + public virtual Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) + { + throw CreateNIE (); + } + + public virtual X509Certificate GetSignerCertificate () + { + throw CreateNIE (); + } + + public virtual Type[] GetTypes() + { + throw CreateNIE (); + } + + public virtual IEnumerable CustomAttributes { + get { return GetCustomAttributesData (); } + } } }