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 partial class Module : ISerializable, ICustomAttributeProvider, _Module {
58 public static readonly TypeFilter FilterTypeName = new TypeFilter (filter_by_type_name);
59 public static readonly TypeFilter FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case);
61 #pragma warning disable 649
62 internal IntPtr _impl; /* a pointer to a MonoImage */
63 internal Assembly assembly;
64 internal string fqname;
66 internal string scopename;
67 internal bool is_resource;
69 #pragma warning restore 649
71 const BindingFlags defaultBindingFlags =
72 BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance;
82 public ModuleHandle ModuleHandle {
84 return new ModuleHandle (_impl);
88 [MethodImplAttribute (MethodImplOptions.InternalCall)]
89 internal static extern int get_MetadataToken (Module module);
91 [MethodImplAttribute (MethodImplOptions.InternalCall)]
92 internal static extern int GetMDStreamVersion (IntPtr module_handle);
94 public FieldInfo GetField (string name)
96 return GetField (name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
99 public FieldInfo[] GetFields ()
101 return GetFields (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
104 public MethodInfo GetMethod (string name)
106 return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, null, null);
109 public MethodInfo GetMethod (string name, Type[] types)
112 throw new ArgumentNullException ("types");
113 return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, types, null);
116 public MethodInfo GetMethod (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
119 throw new ArgumentNullException ("types");
120 return GetMethodImpl (name, bindingAttr, binder, callConvention, types, modifiers);
123 public MethodInfo[] GetMethods ()
125 return GetMethods (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
128 [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
129 public virtual void GetObjectData (SerializationInfo info, StreamingContext context)
132 throw new ArgumentNullException ("info");
134 UnitySerializationHolder.GetModuleData (this, info, context);
138 public virtual Type GetType(string className)
140 return GetType (className, false, false);
144 public virtual Type GetType(string className, bool ignoreCase)
146 return GetType (className, false, ignoreCase);
149 [MethodImplAttribute (MethodImplOptions.InternalCall)]
150 internal extern Type[] InternalGetTypes ();
152 public override string ToString ()
159 return GetModuleVersionId ();
163 internal Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
164 if (error == ResolveTokenError.OutOfRange)
165 return new ArgumentOutOfRangeException ("metadataToken", String.Format ("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name));
167 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");
170 internal IntPtr[] ptrs_from_types (Type[] types) {
174 IntPtr[] res = new IntPtr [types.Length];
175 for (int i = 0; i < types.Length; ++i) {
176 if (types [i] == null)
177 throw new ArgumentException ();
178 res [i] = types [i].TypeHandle.Value;
184 public FieldInfo ResolveField (int metadataToken) {
185 return ResolveField (metadataToken, null, null);
188 public MemberInfo ResolveMember (int metadataToken) {
189 return ResolveMember (metadataToken, null, null);
192 public MethodBase ResolveMethod (int metadataToken) {
193 return ResolveMethod (metadataToken, null, null);
196 public Type ResolveType (int metadataToken) {
197 return ResolveType (metadataToken, null, null);
200 internal static Type MonoDebugger_ResolveType (Module module, int token)
202 ResolveTokenError error;
204 IntPtr handle = ResolveTypeToken (module._impl, token, null, null, out error);
205 if (handle == IntPtr.Zero)
208 return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
211 // Used by mcs, the symbol writer, and mdb through reflection
212 internal static Guid Mono_GetGuid (Module module)
214 return module.GetModuleVersionId ();
217 internal virtual Guid GetModuleVersionId ()
219 return new Guid (GetGuidInternal ());
222 private static bool filter_by_type_name (Type m, object filterCriteria) {
223 string s = (string)filterCriteria;
224 if (s.Length > 0 && s [s.Length - 1] == '*')
225 return m.Name.StartsWith (s.Substring (0, s.Length - 1), StringComparison.Ordinal);
230 private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) {
231 string s = (string)filterCriteria;
232 if (s.Length > 0 && s [s.Length - 1] == '*')
233 return m.Name.StartsWith (s.Substring (0, s.Length - 1), StringComparison.OrdinalIgnoreCase);
235 return String.Equals (m.Name, s, StringComparison.OrdinalIgnoreCase);
238 [MethodImplAttribute (MethodImplOptions.InternalCall)]
239 internal extern IntPtr GetHINSTANCE ();
241 [MethodImplAttribute (MethodImplOptions.InternalCall)]
242 private extern string GetGuidInternal ();
244 [MethodImplAttribute (MethodImplOptions.InternalCall)]
245 internal extern Type GetGlobalType ();
247 [MethodImplAttribute (MethodImplOptions.InternalCall)]
248 internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
250 [MethodImplAttribute (MethodImplOptions.InternalCall)]
251 internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
253 [MethodImplAttribute (MethodImplOptions.InternalCall)]
254 internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
256 [MethodImplAttribute (MethodImplOptions.InternalCall)]
257 internal static extern string ResolveStringToken (IntPtr module, int token, out ResolveTokenError error);
259 [MethodImplAttribute (MethodImplOptions.InternalCall)]
260 internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
262 [MethodImplAttribute (MethodImplOptions.InternalCall)]
263 internal static extern byte[] ResolveSignature (IntPtr module, int metadataToken, out ResolveTokenError error);
265 [MethodImplAttribute (MethodImplOptions.InternalCall)]
266 internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
269 void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
271 throw new NotImplementedException ();
274 void _Module.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
276 throw new NotImplementedException ();
279 void _Module.GetTypeInfoCount (out uint pcTInfo)
281 throw new NotImplementedException ();
284 void _Module.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams,
285 IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
287 throw new NotImplementedException ();
292 public override bool Equals (object o)
294 return o == (object) this;
297 public override int GetHashCode ()
299 return base.GetHashCode ();
302 public static bool operator == (Module left, Module right)
304 if ((object)left == (object)right)
306 if ((object)left == null ^ (object)right == null)
308 return left.Equals (right);
311 public static bool operator != (Module left, Module right)
313 if ((object)left == (object)right)
315 if ((object)left == null ^ (object)right == null)
317 return !left.Equals (right);
324 public virtual Assembly Assembly {
325 get { throw CreateNIE (); }
328 public virtual string Name {
329 get { throw CreateNIE (); }
332 public virtual string ScopeName {
333 get { throw CreateNIE (); }
336 public virtual int MDStreamVersion {
337 get { throw CreateNIE (); }
340 public virtual Guid ModuleVersionId {
341 get { throw CreateNIE (); }
344 public virtual string FullyQualifiedName {
345 get { throw CreateNIE (); }
348 public virtual int MetadataToken {
349 get { throw CreateNIE (); }
352 static Exception CreateNIE ()
354 return new NotImplementedException ("Derived classes must implement it");
357 public virtual bool IsResource()
362 public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria)
367 public virtual object[] GetCustomAttributes(bool inherit)
372 public virtual object[] GetCustomAttributes(Type attributeType, bool inherit)
377 public virtual IList<CustomAttributeData> GetCustomAttributesData ()
382 public virtual FieldInfo GetField (string name, BindingFlags bindingAttr)
387 public virtual FieldInfo[] GetFields (BindingFlags bindingFlags)
392 protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
397 public virtual MethodInfo[] GetMethods (BindingFlags bindingFlags)
402 public virtual void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine)
408 public virtual Type GetType(string className, bool throwOnError, bool ignoreCase)
413 public virtual bool IsDefined (Type attributeType, bool inherit)
418 public virtual FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
423 public virtual MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
428 public virtual MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
433 public virtual byte[] ResolveSignature (int metadataToken)
438 public virtual string ResolveString (int metadataToken)
443 public virtual Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
448 public virtual X509Certificate GetSignerCertificate ()
453 public virtual Type[] GetTypes()