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)
126 throw new ArgumentNullException ("info");
128 UnitySerializationHolder.GetModuleData (this, info, context);
132 public virtual Type GetType(string className)
134 return GetType (className, false, false);
138 public virtual Type GetType(string className, bool ignoreCase)
140 return GetType (className, false, ignoreCase);
143 [MethodImplAttribute (MethodImplOptions.InternalCall)]
144 internal extern Type[] InternalGetTypes ();
146 public override string ToString ()
153 return GetModuleVersionId ();
157 internal Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
158 if (error == ResolveTokenError.OutOfRange)
159 return new ArgumentOutOfRangeException ("metadataToken", String.Format ("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name));
161 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");
164 internal IntPtr[] ptrs_from_types (Type[] types) {
168 IntPtr[] res = new IntPtr [types.Length];
169 for (int i = 0; i < types.Length; ++i) {
170 if (types [i] == null)
171 throw new ArgumentException ();
172 res [i] = types [i].TypeHandle.Value;
178 public FieldInfo ResolveField (int metadataToken) {
179 return ResolveField (metadataToken, null, null);
182 public MemberInfo ResolveMember (int metadataToken) {
183 return ResolveMember (metadataToken, null, null);
186 public MethodBase ResolveMethod (int metadataToken) {
187 return ResolveMethod (metadataToken, null, null);
190 public Type ResolveType (int metadataToken) {
191 return ResolveType (metadataToken, null, null);
194 internal static Type MonoDebugger_ResolveType (Module module, int token)
196 ResolveTokenError error;
198 IntPtr handle = ResolveTypeToken (module._impl, token, null, null, out error);
199 if (handle == IntPtr.Zero)
202 return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
205 // Used by mcs, the symbol writer, and mdb through reflection
206 internal static Guid Mono_GetGuid (Module module)
208 return module.GetModuleVersionId ();
211 internal virtual Guid GetModuleVersionId ()
213 return new Guid (GetGuidInternal ());
216 private static bool filter_by_type_name (Type m, object filterCriteria) {
217 string s = (string)filterCriteria;
218 if (s.Length > 0 && s [s.Length - 1] == '*')
219 return m.Name.StartsWithOrdinalUnchecked (s.Substring (0, s.Length - 1));
224 private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) {
225 string s = (string)filterCriteria;
226 if (s.Length > 0 && s [s.Length - 1] == '*')
227 return m.Name.StartsWithOrdinalCaseInsensitiveUnchecked (s.Substring (0, s.Length - 1));
229 return string.CompareOrdinalCaseInsensitiveUnchecked (m.Name, s) == 0;
232 [MethodImplAttribute (MethodImplOptions.InternalCall)]
233 internal extern IntPtr GetHINSTANCE ();
235 [MethodImplAttribute (MethodImplOptions.InternalCall)]
236 private extern string GetGuidInternal ();
238 [MethodImplAttribute (MethodImplOptions.InternalCall)]
239 internal extern Type GetGlobalType ();
241 [MethodImplAttribute (MethodImplOptions.InternalCall)]
242 internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
244 [MethodImplAttribute (MethodImplOptions.InternalCall)]
245 internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
247 [MethodImplAttribute (MethodImplOptions.InternalCall)]
248 internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
250 [MethodImplAttribute (MethodImplOptions.InternalCall)]
251 internal static extern string ResolveStringToken (IntPtr module, int token, out ResolveTokenError error);
253 [MethodImplAttribute (MethodImplOptions.InternalCall)]
254 internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
256 [MethodImplAttribute (MethodImplOptions.InternalCall)]
257 internal static extern byte[] ResolveSignature (IntPtr module, int metadataToken, out ResolveTokenError error);
259 [MethodImplAttribute (MethodImplOptions.InternalCall)]
260 internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
263 void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
265 throw new NotImplementedException ();
268 void _Module.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
270 throw new NotImplementedException ();
273 void _Module.GetTypeInfoCount (out uint pcTInfo)
275 throw new NotImplementedException ();
278 void _Module.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams,
279 IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
281 throw new NotImplementedException ();
285 public override bool Equals (object o)
287 return o == (object) this;
290 public override int GetHashCode ()
292 return base.GetHashCode ();
295 public static bool operator == (Module left, Module right)
297 if ((object)left == (object)right)
299 if ((object)left == null ^ (object)right == null)
301 return left.Equals (right);
304 public static bool operator != (Module left, Module right)
306 if ((object)left == (object)right)
308 if ((object)left == null ^ (object)right == null)
310 return !left.Equals (right);
315 public virtual Assembly Assembly {
316 get { throw CreateNIE (); }
319 public virtual string Name {
320 get { throw CreateNIE (); }
323 public virtual string ScopeName {
324 get { throw CreateNIE (); }
327 public virtual int MDStreamVersion {
328 get { throw CreateNIE (); }
331 public virtual Guid ModuleVersionId {
332 get { throw CreateNIE (); }
335 public virtual string FullyQualifiedName {
336 get { throw CreateNIE (); }
339 public virtual int MetadataToken {
340 get { throw CreateNIE (); }
343 static Exception CreateNIE ()
345 return new NotImplementedException ("Derived classes must implement it");
348 public virtual bool IsResource()
353 public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria)
358 public virtual object[] GetCustomAttributes(bool inherit)
363 public virtual object[] GetCustomAttributes(Type attributeType, bool inherit)
368 public virtual IList<CustomAttributeData> GetCustomAttributesData ()
373 public virtual FieldInfo GetField (string name, BindingFlags bindingAttr)
378 public virtual FieldInfo[] GetFields (BindingFlags bindingFlags)
383 protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
388 public virtual MethodInfo[] GetMethods (BindingFlags bindingFlags)
393 public virtual void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine)
399 public virtual Type GetType(string className, bool throwOnError, bool ignoreCase)
404 public virtual bool IsDefined (Type attributeType, bool inherit)
409 public virtual FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
414 public virtual MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
419 public virtual MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
424 public virtual byte[] ResolveSignature (int metadataToken)
429 public virtual string ResolveString (int metadataToken)
434 public virtual Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
439 public virtual X509Certificate GetSignerCertificate ()
444 public virtual Type[] GetTypes()
450 public virtual IEnumerable<CustomAttributeData> CustomAttributes {
451 get { return GetCustomAttributesData (); }