Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Web / Util / ArglessEventHandlerProxy.cs / 1305376 / ArglessEventHandlerProxy.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.Util {
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;
using System.Security;
/*
* Proxy that provides EventHandler and redirects it to arg-less method on the given object
*/
internal class ArglessEventHandlerProxy {
private Object _target;
private MethodInfo _arglessMethod;
internal ArglessEventHandlerProxy(Object target, MethodInfo arglessMethod) {
Debug.Assert(arglessMethod.GetParameters().Length == 0);
_target = target;
_arglessMethod = arglessMethod;
}
[ReflectionPermission(SecurityAction.Assert, Flags=ReflectionPermissionFlag.RestrictedMemberAccess)]
internal void Callback(Object sender, EventArgs e) {
_arglessMethod.Invoke(_target, new Object[0]);
}
internal EventHandler Handler {
get {
return new EventHandler(Callback);
}
}
}
internal delegate void VoidMethod();
internal class CalliEventHandlerDelegateProxy {
private IntPtr _functionPointer;
private Object _target;
private bool _argless;
internal CalliEventHandlerDelegateProxy(Object target, IntPtr functionPointer, bool argless) {
_argless = argless;
_target = target;
_functionPointer = functionPointer;
}
internal void Callback(Object sender, EventArgs e) {
if (_argless) {
System.Web.Util.CalliHelper.ArglessFunctionCaller(_functionPointer, _target);
}
else {
System.Web.Util.CalliHelper.EventArgFunctionCaller(_functionPointer, _target, sender, e);
}
}
internal EventHandler Handler {
get {
return new EventHandler(Callback);
}
}
}
#if LCG_Implementation
internal delegate void ArglessMethod(IntPtr methodPtr, Object target);
internal delegate void EventArgMethod(IntPtr methodPtr, Object target, Object source, EventArgs e);
internal class CalliHelper {
internal static ArglessMethod ArglessFunctionCaller;
internal static EventArgMethod EventArgFunctionCaller;
// Make sure we have reflection permission to use ReflectionEmit and access method
[ReflectionPermission(SecurityAction.Assert, Flags = ReflectionPermissionFlag.ReflectionEmit | ReflectionPermissionFlag.MemberAccess)]
static CalliHelper() {
// generate void(void) calli
DynamicMethod dm = new DynamicMethod("void_calli",
typeof(void),
new Type[] { typeof(IntPtr) /* function ptr */, typeof(Object) /* target */},
typeof(CalliHelper).Module);
ILGenerator ilg = dm.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Ldarg_0);
ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[0], null);
ilg.Emit(OpCodes.Ret);
ArglessFunctionCaller = (ArglessMethod)dm.CreateDelegate(typeof(ArglessMethod));
// generate void(Object, EventArgs) calli
dm = new DynamicMethod("eventarg_calli",
typeof(void),
new Type[] { typeof(IntPtr) /* function ptr */, typeof(Object) /* target */, typeof(Object) /* sender */, typeof(EventArgs) },
typeof(CalliHelper).Module);
ilg = dm.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Ldarg_2);
ilg.Emit(OpCodes.Ldarg_3);
ilg.Emit(OpCodes.Ldarg_0);
ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[] { typeof(object) /* sender */, typeof(EventArgs) }, null);
ilg.Emit(OpCodes.Ret);
EventArgFunctionCaller = (EventArgMethod)dm.CreateDelegate(typeof(EventArgMethod));
}
}
#endif //LCG_Implementation
#if Reflection_Emit_Implementation
internal delegate void ArglessMethod(IntPtr methodPtr, Object target);
internal delegate void EventArgMethod(IntPtr methodPtr, Object target, Object source, EventArgs e);
internal class CalliHelper {
internal static ArglessMethod ArglessFunctionCaller;
internal static EventArgMethod EventArgFunctionCaller;
// Make sure we have reflection permission to use ReflectionEmit and access method
[ReflectionPermission(SecurityAction.Assert, Flags = ReflectionPermissionFlag.ReflectionEmit | ReflectionPermissionFlag.MemberAccess)]
static CalliHelper() {
AssemblyName an = new AssemblyName("CalliHelper");
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule("CalliHelper.dll");
ConstructorInfo ci = typeof(CLSCompliantAttribute).GetConstructor(new Type[] { typeof(bool) });
CustomAttributeBuilder cb = new CustomAttributeBuilder(ci, new object[] { true });
mb.SetCustomAttribute(cb);
TypeBuilder tb = mb.DefineType("System.Web.Util.CalliHelper", TypeAttributes.NotPublic | TypeAttributes.Sealed);
MethodBuilder methb = tb.DefineMethod("EventArgMethod", MethodAttributes.Assembly | MethodAttributes.Static, typeof(void), new Type[] { typeof(IntPtr), typeof(object), typeof(object), typeof(EventArgs) });
ILGenerator ilg = methb.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Ldarg_2);
ilg.Emit(OpCodes.Ldarg_3);
ilg.Emit(OpCodes.Ldarg_0);
ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[] { typeof(object), typeof(EventArgs) }, null);
ilg.Emit(OpCodes.Ret);
methb = tb.DefineMethod("ArglessMethod", MethodAttributes.Assembly | MethodAttributes.Static, typeof(void), new Type[] { typeof (IntPtr), typeof(object) });
ilg = methb.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Ldarg_0);
ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[0], null);
ilg.Emit(OpCodes.Ret);
Type t = tb.CreateType();
ArglessFunctionCaller = (ArglessMethod)Delegate.CreateDelegate(typeof(ArglessMethod), t, "ArglessMethod", true);
EventArgFunctionCaller = (EventArgMethod)Delegate.CreateDelegate(typeof(EventArgMethod), t, "EventArgMethod", true);
//ab.Save("CalliHelper.dll");
}
}
#endif // Reflection_Emit_Implementation
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.Util {
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;
using System.Security;
/*
* Proxy that provides EventHandler and redirects it to arg-less method on the given object
*/
internal class ArglessEventHandlerProxy {
private Object _target;
private MethodInfo _arglessMethod;
internal ArglessEventHandlerProxy(Object target, MethodInfo arglessMethod) {
Debug.Assert(arglessMethod.GetParameters().Length == 0);
_target = target;
_arglessMethod = arglessMethod;
}
[ReflectionPermission(SecurityAction.Assert, Flags=ReflectionPermissionFlag.RestrictedMemberAccess)]
internal void Callback(Object sender, EventArgs e) {
_arglessMethod.Invoke(_target, new Object[0]);
}
internal EventHandler Handler {
get {
return new EventHandler(Callback);
}
}
}
internal delegate void VoidMethod();
internal class CalliEventHandlerDelegateProxy {
private IntPtr _functionPointer;
private Object _target;
private bool _argless;
internal CalliEventHandlerDelegateProxy(Object target, IntPtr functionPointer, bool argless) {
_argless = argless;
_target = target;
_functionPointer = functionPointer;
}
internal void Callback(Object sender, EventArgs e) {
if (_argless) {
System.Web.Util.CalliHelper.ArglessFunctionCaller(_functionPointer, _target);
}
else {
System.Web.Util.CalliHelper.EventArgFunctionCaller(_functionPointer, _target, sender, e);
}
}
internal EventHandler Handler {
get {
return new EventHandler(Callback);
}
}
}
#if LCG_Implementation
internal delegate void ArglessMethod(IntPtr methodPtr, Object target);
internal delegate void EventArgMethod(IntPtr methodPtr, Object target, Object source, EventArgs e);
internal class CalliHelper {
internal static ArglessMethod ArglessFunctionCaller;
internal static EventArgMethod EventArgFunctionCaller;
// Make sure we have reflection permission to use ReflectionEmit and access method
[ReflectionPermission(SecurityAction.Assert, Flags = ReflectionPermissionFlag.ReflectionEmit | ReflectionPermissionFlag.MemberAccess)]
static CalliHelper() {
// generate void(void) calli
DynamicMethod dm = new DynamicMethod("void_calli",
typeof(void),
new Type[] { typeof(IntPtr) /* function ptr */, typeof(Object) /* target */},
typeof(CalliHelper).Module);
ILGenerator ilg = dm.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Ldarg_0);
ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[0], null);
ilg.Emit(OpCodes.Ret);
ArglessFunctionCaller = (ArglessMethod)dm.CreateDelegate(typeof(ArglessMethod));
// generate void(Object, EventArgs) calli
dm = new DynamicMethod("eventarg_calli",
typeof(void),
new Type[] { typeof(IntPtr) /* function ptr */, typeof(Object) /* target */, typeof(Object) /* sender */, typeof(EventArgs) },
typeof(CalliHelper).Module);
ilg = dm.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Ldarg_2);
ilg.Emit(OpCodes.Ldarg_3);
ilg.Emit(OpCodes.Ldarg_0);
ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[] { typeof(object) /* sender */, typeof(EventArgs) }, null);
ilg.Emit(OpCodes.Ret);
EventArgFunctionCaller = (EventArgMethod)dm.CreateDelegate(typeof(EventArgMethod));
}
}
#endif //LCG_Implementation
#if Reflection_Emit_Implementation
internal delegate void ArglessMethod(IntPtr methodPtr, Object target);
internal delegate void EventArgMethod(IntPtr methodPtr, Object target, Object source, EventArgs e);
internal class CalliHelper {
internal static ArglessMethod ArglessFunctionCaller;
internal static EventArgMethod EventArgFunctionCaller;
// Make sure we have reflection permission to use ReflectionEmit and access method
[ReflectionPermission(SecurityAction.Assert, Flags = ReflectionPermissionFlag.ReflectionEmit | ReflectionPermissionFlag.MemberAccess)]
static CalliHelper() {
AssemblyName an = new AssemblyName("CalliHelper");
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule("CalliHelper.dll");
ConstructorInfo ci = typeof(CLSCompliantAttribute).GetConstructor(new Type[] { typeof(bool) });
CustomAttributeBuilder cb = new CustomAttributeBuilder(ci, new object[] { true });
mb.SetCustomAttribute(cb);
TypeBuilder tb = mb.DefineType("System.Web.Util.CalliHelper", TypeAttributes.NotPublic | TypeAttributes.Sealed);
MethodBuilder methb = tb.DefineMethod("EventArgMethod", MethodAttributes.Assembly | MethodAttributes.Static, typeof(void), new Type[] { typeof(IntPtr), typeof(object), typeof(object), typeof(EventArgs) });
ILGenerator ilg = methb.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Ldarg_2);
ilg.Emit(OpCodes.Ldarg_3);
ilg.Emit(OpCodes.Ldarg_0);
ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[] { typeof(object), typeof(EventArgs) }, null);
ilg.Emit(OpCodes.Ret);
methb = tb.DefineMethod("ArglessMethod", MethodAttributes.Assembly | MethodAttributes.Static, typeof(void), new Type[] { typeof (IntPtr), typeof(object) });
ilg = methb.GetILGenerator();
ilg.Emit(OpCodes.Ldarg_1);
ilg.Emit(OpCodes.Ldarg_0);
ilg.EmitCalli(OpCodes.Calli, CallingConventions.HasThis, typeof(void), new Type[0], null);
ilg.Emit(OpCodes.Ret);
Type t = tb.CreateType();
ArglessFunctionCaller = (ArglessMethod)Delegate.CreateDelegate(typeof(ArglessMethod), t, "ArglessMethod", true);
EventArgFunctionCaller = (EventArgMethod)Delegate.CreateDelegate(typeof(EventArgMethod), t, "EventArgMethod", true);
//ab.Save("CalliHelper.dll");
}
}
#endif // Reflection_Emit_Implementation
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PieceNameHelper.cs
- SwitchCase.cs
- RequiredAttributeAttribute.cs
- OverrideMode.cs
- SpeechSynthesizer.cs
- NewArrayExpression.cs
- ConfigsHelper.cs
- SingleKeyFrameCollection.cs
- ParsedRoute.cs
- SqlUtil.cs
- XmlFormatMapping.cs
- Propagator.Evaluator.cs
- WebPartMenu.cs
- RegisteredDisposeScript.cs
- ViewRendering.cs
- SecurityHelper.cs
- VerificationAttribute.cs
- ColorTransform.cs
- CompositeFontInfo.cs
- MetadataCache.cs
- CellPartitioner.cs
- AxHost.cs
- AnnouncementClient.cs
- EmbeddedObject.cs
- Point3DAnimationUsingKeyFrames.cs
- DataServiceRequestOfT.cs
- RuntimeIdentifierPropertyAttribute.cs
- TextDocumentView.cs
- CallbackDebugElement.cs
- TimeSpan.cs
- ScriptBehaviorDescriptor.cs
- PolicyStatement.cs
- FontClient.cs
- StrongNameSignatureInformation.cs
- ScalarType.cs
- HostedHttpTransportManager.cs
- filewebrequest.cs
- SortedDictionary.cs
- CqlWriter.cs
- iisPickupDirectory.cs
- QilUnary.cs
- PageThemeCodeDomTreeGenerator.cs
- Baml2006SchemaContext.cs
- ActivityDesigner.cs
- Metafile.cs
- MessagePropertyFilter.cs
- Color.cs
- SafeNativeMethods.cs
- JsonClassDataContract.cs
- TextAutomationPeer.cs
- Rotation3DAnimation.cs
- WebPartUserCapability.cs
- x509utils.cs
- StylusPointPropertyInfoDefaults.cs
- VisualStyleTypesAndProperties.cs
- AdditionalEntityFunctions.cs
- Parallel.cs
- COM2PropertyBuilderUITypeEditor.cs
- GridErrorDlg.cs
- CodeDOMProvider.cs
- XmlNodeComparer.cs
- SystemColors.cs
- JsonServiceDocumentSerializer.cs
- SQLGuidStorage.cs
- CheckPair.cs
- XmlSchemaObject.cs
- HyperLink.cs
- FormsAuthenticationTicket.cs
- StringFreezingAttribute.cs
- TraceInternal.cs
- StreamGeometryContext.cs
- UICuesEvent.cs
- DesignSurface.cs
- Code.cs
- InternalControlCollection.cs
- X509RecipientCertificateServiceElement.cs
- SaveFileDialogDesigner.cs
- Substitution.cs
- TimeStampChecker.cs
- FolderNameEditor.cs
- RequestNavigateEventArgs.cs
- Utils.cs
- QilXmlWriter.cs
- CookieHandler.cs
- ConfigurationSettings.cs
- COM2Properties.cs
- CompressionTransform.cs
- JapaneseLunisolarCalendar.cs
- Constants.cs
- WmpBitmapDecoder.cs
- SystemTcpConnection.cs
- ContainerVisual.cs
- ResXResourceReader.cs
- InteropBitmapSource.cs
- ObjectHelper.cs
- Pkcs9Attribute.cs
- GroupBox.cs
- HttpListenerResponse.cs
- RunInstallerAttribute.cs
- SQLChars.cs