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)]
52 public class Module : ISerializable, ICustomAttributeProvider, _Module {
54 public partial class Module : ISerializable, ICustomAttributeProvider, _Module {
56 public static readonly TypeFilter FilterTypeName;
57 public static readonly TypeFilter FilterTypeNameIgnoreCase;
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;
73 FilterTypeName = new TypeFilter (filter_by_type_name);
74 FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case);
86 public Assembly Assembly {
87 get { return assembly; }
90 public virtual string FullyQualifiedName {
93 if (SecurityManager.SecurityEnabled) {
94 new FileIOPermission (FileIOPermissionAccess.PathDiscovery, fqname).Demand ();
101 // Note: we do not ask for PathDiscovery because no path is returned here.
102 // However MS Fx requires it (see FDBK23572 for details).
107 public string ScopeName {
108 get { return scopename; }
111 public ModuleHandle ModuleHandle {
113 return new ModuleHandle (_impl);
117 public extern int MetadataToken {
118 [MethodImplAttribute (MethodImplOptions.InternalCall)]
122 public int MDStreamVersion {
124 if (_impl == IntPtr.Zero)
125 throw new NotSupportedException ();
126 return GetMDStreamVersion (_impl);
130 [MethodImplAttribute (MethodImplOptions.InternalCall)]
131 internal static extern int GetMDStreamVersion (IntPtr module_handle);
133 public FieldInfo GetField (string name)
135 return GetField (name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
138 public FieldInfo[] GetFields ()
140 return GetFields (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
143 public MethodInfo GetMethod (string name)
145 //FIXME this sure breaks since Type.GetMethod throws due to a null 'type' array. But it's what MS does
146 return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, null, null);
149 public MethodInfo GetMethod (string name, Type[] types)
151 return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, types, null);
154 public MethodInfo GetMethod (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
156 return GetMethodImpl (name, bindingAttr, binder, callConvention, types, modifiers);
159 public MethodInfo[] GetMethods ()
161 return GetMethods (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
164 [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
165 public virtual void GetObjectData (SerializationInfo info, StreamingContext context)
168 throw new ArgumentNullException ("info");
170 UnitySerializationHolder.GetModuleData (this, info, context);
174 public virtual Type GetType(string className)
176 return GetType (className, false, false);
180 public virtual Type GetType(string className, bool ignoreCase)
182 return GetType (className, false, ignoreCase);
185 [MethodImplAttribute (MethodImplOptions.InternalCall)]
186 internal extern Type[] InternalGetTypes ();
188 public override string ToString ()
195 return GetModuleVersionId ();
199 public Guid ModuleVersionId {
201 return GetModuleVersionId ();
205 internal Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
206 if (error == ResolveTokenError.OutOfRange)
207 return new ArgumentOutOfRangeException ("metadataToken", String.Format ("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name));
209 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");
212 internal IntPtr[] ptrs_from_types (Type[] types) {
216 IntPtr[] res = new IntPtr [types.Length];
217 for (int i = 0; i < types.Length; ++i) {
218 if (types [i] == null)
219 throw new ArgumentException ();
220 res [i] = types [i].TypeHandle.Value;
226 public FieldInfo ResolveField (int metadataToken) {
227 return ResolveField (metadataToken, null, null);
230 public MemberInfo ResolveMember (int metadataToken) {
231 return ResolveMember (metadataToken, null, null);
234 public MethodBase ResolveMethod (int metadataToken) {
235 return ResolveMethod (metadataToken, null, null);
238 public Type ResolveType (int metadataToken) {
239 return ResolveType (metadataToken, null, null);
242 internal static Type MonoDebugger_ResolveType (Module module, int token)
244 ResolveTokenError error;
246 IntPtr handle = ResolveTypeToken (module._impl, token, null, null, out error);
247 if (handle == IntPtr.Zero)
250 return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
253 // Used by mcs, the symbol writer, and mdb through reflection
254 internal static Guid Mono_GetGuid (Module module)
256 return module.GetModuleVersionId ();
259 internal virtual Guid GetModuleVersionId ()
261 return new Guid (GetGuidInternal ());
264 private static bool filter_by_type_name (Type m, object filterCriteria) {
265 string s = (string)filterCriteria;
266 if (s.EndsWith ("*"))
267 return m.Name.StartsWith (s.Substring (0, s.Length - 1));
272 private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) {
273 string s = (string)filterCriteria;
274 if (s.EndsWith ("*"))
275 return m.Name.ToLower ().StartsWith (s.Substring (0, s.Length - 1).ToLower ());
277 return String.Compare (m.Name, s, true) == 0;
280 [MethodImplAttribute (MethodImplOptions.InternalCall)]
281 internal extern IntPtr GetHINSTANCE ();
283 [MethodImplAttribute (MethodImplOptions.InternalCall)]
284 private extern string GetGuidInternal ();
286 [MethodImplAttribute (MethodImplOptions.InternalCall)]
287 internal extern Type GetGlobalType ();
289 [MethodImplAttribute (MethodImplOptions.InternalCall)]
290 internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
292 [MethodImplAttribute (MethodImplOptions.InternalCall)]
293 internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
295 [MethodImplAttribute (MethodImplOptions.InternalCall)]
296 internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
298 [MethodImplAttribute (MethodImplOptions.InternalCall)]
299 internal static extern string ResolveStringToken (IntPtr module, int token, out ResolveTokenError error);
301 [MethodImplAttribute (MethodImplOptions.InternalCall)]
302 internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
304 [MethodImplAttribute (MethodImplOptions.InternalCall)]
305 internal static extern byte[] ResolveSignature (IntPtr module, int metadataToken, out ResolveTokenError error);
307 [MethodImplAttribute (MethodImplOptions.InternalCall)]
308 internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
310 void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
312 throw new NotImplementedException ();
315 void _Module.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
317 throw new NotImplementedException ();
320 void _Module.GetTypeInfoCount (out uint pcTInfo)
322 throw new NotImplementedException ();
325 void _Module.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams,
326 IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
328 throw new NotImplementedException ();
332 static Exception CreateNIE ()
334 return new NotImplementedException ("Derived classes must implement it");
337 public virtual bool IsResource()
342 public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria)
347 public virtual object[] GetCustomAttributes(bool inherit)
352 public virtual object[] GetCustomAttributes(Type attributeType, bool inherit)
357 public virtual IList<CustomAttributeData> GetCustomAttributesData ()
362 public virtual FieldInfo GetField (string name, BindingFlags bindingAttr)
367 public virtual FieldInfo[] GetFields (BindingFlags bindingFlags)
372 protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
377 public virtual MethodInfo[] GetMethods (BindingFlags bindingFlags)
382 public virtual void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine)
388 public virtual Type GetType(string className, bool throwOnError, bool ignoreCase)
393 public virtual bool IsDefined (Type attributeType, bool inherit)
398 public virtual FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
403 public virtual MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
408 public virtual MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
413 public virtual byte[] ResolveSignature (int metadataToken)
418 public virtual string ResolveString (int metadataToken)
423 public virtual Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
428 public virtual X509Certificate GetSignerCertificate ()
433 public virtual Type[] GetTypes()