2 // System.Reflection/Module.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.Runtime.Serialization;
31 using System.Security.Cryptography.X509Certificates;
32 using System.Runtime.InteropServices;
33 using System.Runtime.CompilerServices;
34 using System.Security;
35 using System.Security.Permissions;
36 using System.Collections.Generic;
38 namespace System.Reflection {
40 internal enum ResolveTokenError {
47 [ComDefaultInterfaceAttribute (typeof (_Module))]
49 [ClassInterfaceAttribute (ClassInterfaceType.None)]
50 [StructLayout (LayoutKind.Sequential)]
52 public abstract class Module : ISerializable, ICustomAttributeProvider {
54 public abstract class Module : ISerializable, ICustomAttributeProvider, _Module {
56 public static readonly TypeFilter FilterTypeName = new TypeFilter (filter_by_type_name);
57 public static readonly TypeFilter FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case);
59 #pragma warning disable 649
60 internal IntPtr _impl; /* a pointer to a MonoImage */
61 internal Assembly assembly;
62 internal string fqname;
64 internal string scopename;
65 internal bool is_resource;
67 #pragma warning restore 649
69 const BindingFlags defaultBindingFlags =
70 BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance;
76 public ModuleHandle ModuleHandle {
78 return new ModuleHandle (_impl);
82 [MethodImplAttribute (MethodImplOptions.InternalCall)]
83 internal static extern int get_MetadataToken (Module module);
85 [MethodImplAttribute (MethodImplOptions.InternalCall)]
86 internal static extern int GetMDStreamVersion (IntPtr module_handle);
88 public FieldInfo GetField (string name)
90 return GetField (name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
93 public FieldInfo[] GetFields ()
95 return GetFields (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
98 public MethodInfo GetMethod (string name)
100 return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, null, null);
103 public MethodInfo GetMethod (string name, Type[] types)
106 throw new ArgumentNullException ("types");
107 return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, types, null);
110 public MethodInfo GetMethod (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
113 throw new ArgumentNullException ("types");
114 return GetMethodImpl (name, bindingAttr, binder, callConvention, types, modifiers);
117 public MethodInfo[] GetMethods ()
119 return GetMethods (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
122 [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
123 public virtual void GetObjectData (SerializationInfo info, StreamingContext context)
125 throw new NotImplementedException ();
129 public virtual Type GetType(string className)
131 return GetType (className, false, false);
135 public virtual Type GetType(string className, bool ignoreCase)
137 return GetType (className, false, ignoreCase);
140 [MethodImplAttribute (MethodImplOptions.InternalCall)]
141 internal extern Type[] InternalGetTypes ();
143 public override string ToString ()
150 return GetModuleVersionId ();
154 internal Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
155 if (error == ResolveTokenError.OutOfRange)
156 return new ArgumentOutOfRangeException ("metadataToken", String.Format ("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name));
158 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");
161 internal IntPtr[] ptrs_from_types (Type[] types) {
165 IntPtr[] res = new IntPtr [types.Length];
166 for (int i = 0; i < types.Length; ++i) {
167 if (types [i] == null)
168 throw new ArgumentException ();
169 res [i] = types [i].TypeHandle.Value;
175 public FieldInfo ResolveField (int metadataToken) {
176 return ResolveField (metadataToken, null, null);
179 public MemberInfo ResolveMember (int metadataToken) {
180 return ResolveMember (metadataToken, null, null);
183 public MethodBase ResolveMethod (int metadataToken) {
184 return ResolveMethod (metadataToken, null, null);
187 public Type ResolveType (int metadataToken) {
188 return ResolveType (metadataToken, null, null);
191 internal static Type MonoDebugger_ResolveType (Module module, int token)
193 ResolveTokenError error;
195 IntPtr handle = ResolveTypeToken (module._impl, token, null, null, out error);
196 if (handle == IntPtr.Zero)
199 return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
202 // Used by mcs, the symbol writer, and mdb through reflection
203 internal static Guid Mono_GetGuid (Module module)
205 return module.GetModuleVersionId ();
208 internal virtual Guid GetModuleVersionId ()
210 return new Guid (GetGuidInternal ());
213 private static bool filter_by_type_name (Type m, object filterCriteria) {
214 string s = (string)filterCriteria;
215 if (s.Length > 0 && s [s.Length - 1] == '*')
216 return m.Name.StartsWithOrdinalUnchecked (s.Substring (0, s.Length - 1));
221 private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) {
222 string s = (string)filterCriteria;
223 if (s.Length > 0 && s [s.Length - 1] == '*')
224 return m.Name.StartsWithOrdinalCaseInsensitiveUnchecked (s.Substring (0, s.Length - 1));
226 return string.CompareOrdinalCaseInsensitiveUnchecked (m.Name, s) == 0;
229 [MethodImplAttribute (MethodImplOptions.InternalCall)]
230 internal extern IntPtr GetHINSTANCE ();
232 [MethodImplAttribute (MethodImplOptions.InternalCall)]
233 private extern string GetGuidInternal ();
235 [MethodImplAttribute (MethodImplOptions.InternalCall)]
236 internal extern Type GetGlobalType ();
238 [MethodImplAttribute (MethodImplOptions.InternalCall)]
239 internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
241 [MethodImplAttribute (MethodImplOptions.InternalCall)]
242 internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
244 [MethodImplAttribute (MethodImplOptions.InternalCall)]
245 internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
247 [MethodImplAttribute (MethodImplOptions.InternalCall)]
248 internal static extern string ResolveStringToken (IntPtr module, int token, out ResolveTokenError error);
250 [MethodImplAttribute (MethodImplOptions.InternalCall)]
251 internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
253 [MethodImplAttribute (MethodImplOptions.InternalCall)]
254 internal static extern byte[] ResolveSignature (IntPtr module, int metadataToken, out ResolveTokenError error);
256 [MethodImplAttribute (MethodImplOptions.InternalCall)]
257 internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
260 void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
262 throw new NotImplementedException ();
265 void _Module.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
267 throw new NotImplementedException ();
270 void _Module.GetTypeInfoCount (out uint pcTInfo)
272 throw new NotImplementedException ();
275 void _Module.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams,
276 IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
278 throw new NotImplementedException ();
282 public override bool Equals (object o)
284 return o == (object) this;
287 public override int GetHashCode ()
289 return base.GetHashCode ();
292 public static bool operator == (Module left, Module right)
294 if ((object)left == (object)right)
296 if ((object)left == null ^ (object)right == null)
298 return left.Equals (right);
301 public static bool operator != (Module left, Module right)
303 if ((object)left == (object)right)
305 if ((object)left == null ^ (object)right == null)
307 return !left.Equals (right);
312 public virtual Assembly Assembly {
313 get { throw CreateNIE (); }
316 public virtual string Name {
317 get { throw CreateNIE (); }
320 public virtual string ScopeName {
321 get { throw CreateNIE (); }
324 public virtual int MDStreamVersion {
325 get { throw CreateNIE (); }
328 public virtual Guid ModuleVersionId {
329 get { throw CreateNIE (); }
332 public virtual string FullyQualifiedName {
333 get { throw CreateNIE (); }
336 public virtual int MetadataToken {
337 get { throw CreateNIE (); }
340 static Exception CreateNIE ()
342 return new NotImplementedException ("Derived classes must implement it");
345 public virtual bool IsResource()
350 public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria)
355 public virtual object[] GetCustomAttributes(bool inherit)
360 public virtual object[] GetCustomAttributes(Type attributeType, bool inherit)
365 public virtual IList<CustomAttributeData> GetCustomAttributesData ()
370 public virtual FieldInfo GetField (string name, BindingFlags bindingAttr)
375 public virtual FieldInfo[] GetFields (BindingFlags bindingFlags)
380 protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
385 public virtual MethodInfo[] GetMethods (BindingFlags bindingFlags)
390 public virtual void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine)
396 public virtual Type GetType(string className, bool throwOnError, bool ignoreCase)
401 public virtual bool IsDefined (Type attributeType, bool inherit)
406 public virtual FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
411 public virtual MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
416 public virtual MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
421 public virtual byte[] ResolveSignature (int metadataToken)
426 public virtual string ResolveString (int metadataToken)
431 public virtual Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
436 public virtual X509Certificate GetSignerCertificate ()
441 public virtual Type[] GetTypes()
446 public virtual IEnumerable<CustomAttributeData> CustomAttributes {
447 get { return GetCustomAttributesData (); }