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)]
51 #if NET_4_0 || MOONLIGHT || MOBILE
52 public abstract class Module : ISerializable, ICustomAttributeProvider, _Module {
54 public partial 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;
72 #if NET_4_0 || MOONLIGHT || MOBILE
80 public ModuleHandle ModuleHandle {
82 return new ModuleHandle (_impl);
86 [MethodImplAttribute (MethodImplOptions.InternalCall)]
87 internal static extern int get_MetadataToken (Module module);
89 [MethodImplAttribute (MethodImplOptions.InternalCall)]
90 internal static extern int GetMDStreamVersion (IntPtr module_handle);
92 public FieldInfo GetField (string name)
94 return GetField (name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
97 public FieldInfo[] GetFields ()
99 return GetFields (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
102 public MethodInfo GetMethod (string name)
104 return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, null, null);
107 public MethodInfo GetMethod (string name, Type[] types)
110 throw new ArgumentNullException ("types");
111 return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, types, null);
114 public MethodInfo GetMethod (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
117 throw new ArgumentNullException ("types");
118 return GetMethodImpl (name, bindingAttr, binder, callConvention, types, modifiers);
121 public MethodInfo[] GetMethods ()
123 return GetMethods (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
126 [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
127 public virtual void GetObjectData (SerializationInfo info, StreamingContext context)
130 throw new ArgumentNullException ("info");
132 UnitySerializationHolder.GetModuleData (this, info, context);
136 public virtual Type GetType(string className)
138 return GetType (className, false, false);
142 public virtual Type GetType(string className, bool ignoreCase)
144 return GetType (className, false, ignoreCase);
147 [MethodImplAttribute (MethodImplOptions.InternalCall)]
148 internal extern Type[] InternalGetTypes ();
150 public override string ToString ()
157 return GetModuleVersionId ();
161 internal Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
162 if (error == ResolveTokenError.OutOfRange)
163 return new ArgumentOutOfRangeException ("metadataToken", String.Format ("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name));
165 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");
168 internal IntPtr[] ptrs_from_types (Type[] types) {
172 IntPtr[] res = new IntPtr [types.Length];
173 for (int i = 0; i < types.Length; ++i) {
174 if (types [i] == null)
175 throw new ArgumentException ();
176 res [i] = types [i].TypeHandle.Value;
182 public FieldInfo ResolveField (int metadataToken) {
183 return ResolveField (metadataToken, null, null);
186 public MemberInfo ResolveMember (int metadataToken) {
187 return ResolveMember (metadataToken, null, null);
190 public MethodBase ResolveMethod (int metadataToken) {
191 return ResolveMethod (metadataToken, null, null);
194 public Type ResolveType (int metadataToken) {
195 return ResolveType (metadataToken, null, null);
198 internal static Type MonoDebugger_ResolveType (Module module, int token)
200 ResolveTokenError error;
202 IntPtr handle = ResolveTypeToken (module._impl, token, null, null, out error);
203 if (handle == IntPtr.Zero)
206 return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
209 // Used by mcs, the symbol writer, and mdb through reflection
210 internal static Guid Mono_GetGuid (Module module)
212 return module.GetModuleVersionId ();
215 internal virtual Guid GetModuleVersionId ()
217 return new Guid (GetGuidInternal ());
220 private static bool filter_by_type_name (Type m, object filterCriteria) {
221 string s = (string)filterCriteria;
222 if (s.EndsWith ("*"))
223 return m.Name.StartsWith (s.Substring (0, s.Length - 1));
228 private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) {
229 string s = (string)filterCriteria;
230 if (s.EndsWith ("*"))
231 return m.Name.ToLower ().StartsWith (s.Substring (0, s.Length - 1).ToLower ());
233 return String.Compare (m.Name, s, true) == 0;
236 [MethodImplAttribute (MethodImplOptions.InternalCall)]
237 internal extern IntPtr GetHINSTANCE ();
239 [MethodImplAttribute (MethodImplOptions.InternalCall)]
240 private extern string GetGuidInternal ();
242 [MethodImplAttribute (MethodImplOptions.InternalCall)]
243 internal extern Type GetGlobalType ();
245 [MethodImplAttribute (MethodImplOptions.InternalCall)]
246 internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
248 [MethodImplAttribute (MethodImplOptions.InternalCall)]
249 internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
251 [MethodImplAttribute (MethodImplOptions.InternalCall)]
252 internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
254 [MethodImplAttribute (MethodImplOptions.InternalCall)]
255 internal static extern string ResolveStringToken (IntPtr module, int token, out ResolveTokenError error);
257 [MethodImplAttribute (MethodImplOptions.InternalCall)]
258 internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
260 [MethodImplAttribute (MethodImplOptions.InternalCall)]
261 internal static extern byte[] ResolveSignature (IntPtr module, int metadataToken, out ResolveTokenError error);
263 [MethodImplAttribute (MethodImplOptions.InternalCall)]
264 internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
266 void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
268 throw new NotImplementedException ();
271 void _Module.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
273 throw new NotImplementedException ();
276 void _Module.GetTypeInfoCount (out uint pcTInfo)
278 throw new NotImplementedException ();
281 void _Module.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams,
282 IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
284 throw new NotImplementedException ();
288 public override bool Equals (object o)
290 return o == (object) this;
293 public override int GetHashCode ()
295 return base.GetHashCode ();
298 public static bool operator == (Module left, Module right)
300 if ((object)left == (object)right)
302 if ((object)left == null ^ (object)right == null)
304 return left.Equals (right);
307 public static bool operator != (Module left, Module right)
309 if ((object)left == (object)right)
311 if ((object)left == null ^ (object)right == null)
313 return !left.Equals (right);
318 #if NET_4_0 || MOONLIGHT || MOBILE
320 public virtual Assembly Assembly {
321 get { throw CreateNIE (); }
324 public virtual string Name {
325 get { throw CreateNIE (); }
328 public virtual string ScopeName {
329 get { throw CreateNIE (); }
332 public virtual int MDStreamVersion {
333 get { throw CreateNIE (); }
336 public virtual Guid ModuleVersionId {
337 get { throw CreateNIE (); }
340 public virtual string FullyQualifiedName {
341 get { throw CreateNIE (); }
344 public virtual int MetadataToken {
345 get { throw CreateNIE (); }
348 static Exception CreateNIE ()
350 return new NotImplementedException ("Derived classes must implement it");
353 public virtual bool IsResource()
358 public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria)
363 public virtual object[] GetCustomAttributes(bool inherit)
368 public virtual object[] GetCustomAttributes(Type attributeType, bool inherit)
373 public virtual IList<CustomAttributeData> GetCustomAttributesData ()
378 public virtual FieldInfo GetField (string name, BindingFlags bindingAttr)
383 public virtual FieldInfo[] GetFields (BindingFlags bindingFlags)
388 protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
393 public virtual MethodInfo[] GetMethods (BindingFlags bindingFlags)
398 public virtual void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine)
404 public virtual Type GetType(string className, bool throwOnError, bool ignoreCase)
409 public virtual bool IsDefined (Type attributeType, bool inherit)
414 public virtual FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
419 public virtual MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
424 public virtual MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
429 public virtual byte[] ResolveSignature (int metadataToken)
434 public virtual string ResolveString (int metadataToken)
439 public virtual Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
444 public virtual X509Certificate GetSignerCertificate ()
449 public virtual Type[] GetTypes()