1 #if !SILVERLIGHT && CLR40
\r
4 using System.Reflection;
\r
5 using System.Security;
\r
6 using System.Security.Permissions;
\r
8 namespace Microsoft.Internal
\r
10 internal static class ReflectionInvoke
\r
12 private static readonly ReflectionPermission _memberAccess = new ReflectionPermission(ReflectionPermissionFlag.MemberAccess);
\r
13 private static readonly ReflectionPermission _restrictedMemberAccess = new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess);
\r
15 public static object SafeCreateInstance(this Type type, params object[] arguments)
\r
17 DemandMemberAccessIfNeeded(type);
\r
19 return Activator.CreateInstance(type, arguments);
\r
22 public static object SafeInvoke(this ConstructorInfo constructor, params object[] arguments)
\r
24 DemandMemberAccessIfNeeded(constructor);
\r
26 return constructor.Invoke(arguments);
\r
29 public static object SafeInvoke(this MethodInfo method, object instance, params object[] arguments)
\r
31 DemandMemberAccessIfNeeded(method);
\r
33 return method.Invoke(instance, arguments);
\r
36 public static object SafeGetValue(this FieldInfo field, object instance)
\r
38 DemandMemberAccessIfNeeded(field);
\r
40 return field.GetValue(instance);
\r
43 public static void SafeSetValue(this FieldInfo field, object instance, object value)
\r
45 DemandMemberAccessIfNeeded(field);
\r
47 field.SetValue(instance, value);
\r
50 public static void DemandMemberAccessIfNeeded(MethodInfo method)
\r
52 if (!method.IsVisible())
\r
54 DemandMemberAccess(method);
\r
58 private static void DemandMemberAccessIfNeeded(FieldInfo field)
\r
60 if (!field.IsVisible())
\r
62 DemandMemberAccess(field);
\r
66 public static void DemandMemberAccessIfNeeded(Type type)
\r
68 // Consult UnderlyingSystemType this is the type that Activator.CreateInstance creates
\r
69 if (!type.UnderlyingSystemType.IsVisible)
\r
71 DemandMemberAccess(type);
\r
75 private static void DemandMemberAccessIfNeeded(ConstructorInfo constructor)
\r
77 if (!constructor.IsVisible())
\r
79 DemandMemberAccess(constructor);
\r
83 private static void DemandMemberAccess(MemberInfo target)
\r
87 _memberAccess.Demand();
\r
89 catch (SecurityException)
\r
90 { // The caller doesn't have member access, but let's see whether they have access to
\r
91 // members of assemblies with less or equal permissions (this mimics Reflection's behavior)
\r
93 DemandRestrictedMemberAccess(target);
\r
97 private static void DemandRestrictedMemberAccess(MemberInfo target)
\r
99 Assembly targetAssembly = target.Assembly();
\r
101 PermissionSet targetGrantSet = UnsafePermissionSet(targetAssembly);
\r
102 targetGrantSet.AddPermission(_restrictedMemberAccess);
\r
103 targetGrantSet.Demand();
\r
106 [SecuritySafeCritical] // PermissionSet is [SecurityCritical]
\r
107 private static PermissionSet UnsafePermissionSet(Assembly assembly)
\r
109 return assembly.PermissionSet;
\r