Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Runtime / InteropServices / ComAwareEventInfo.cs / 1305376 / ComAwareEventInfo.cs
using System; using System.Security.Permissions; namespace System.Runtime.InteropServices { [System.Security.SecuritySafeCritical] public class ComAwareEventInfo : System.Reflection.EventInfo { #region private fields private System.Reflection.EventInfo _innerEventInfo; #endregion #region ctor public ComAwareEventInfo(Type type, string eventName) { _innerEventInfo = type.GetEvent(eventName); } #endregion #region protected overrides public override void AddEventHandler(object target, Delegate handler) { if (Marshal.IsComObject(target)) { // retrieve sourceIid and dispid Guid sourceIid; int dispid; GetDataForComInvocation(_innerEventInfo, out sourceIid, out dispid); // now validate the caller can call into native and redirect to ComEventHelpers.Combine SecurityPermission perm = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); perm.Demand(); System.Runtime.InteropServices.ComEventsHelper.Combine(target, sourceIid, dispid, handler); } else { // we are dealing with a managed object - just add the delegate through reflection _innerEventInfo.AddEventHandler(target, handler); } } public override void RemoveEventHandler(object target, Delegate handler) { if (Marshal.IsComObject(target)) { // retrieve sourceIid and dispid Guid sourceIid; int dispid; GetDataForComInvocation(_innerEventInfo, out sourceIid, out dispid); // now validate the caller can call into native and redirect to ComEventHelpers.Combine SecurityPermission perm = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode); perm.Demand(); System.Runtime.InteropServices.ComEventsHelper.Remove(target, sourceIid, dispid, handler); } else { // we are dealing with a managed object - just add the delegate through relection _innerEventInfo.RemoveEventHandler(target, handler); } } #endregion #region public overrides public override System.Reflection.EventAttributes Attributes { get { return _innerEventInfo.Attributes; } } public override System.Reflection.MethodInfo GetAddMethod(bool nonPublic) { return _innerEventInfo.GetAddMethod(nonPublic); } public override System.Reflection.MethodInfo GetRaiseMethod(bool nonPublic) { return _innerEventInfo.GetRaiseMethod(nonPublic); } public override System.Reflection.MethodInfo GetRemoveMethod(bool nonPublic) { return _innerEventInfo.GetRemoveMethod(nonPublic); } public override Type DeclaringType { get { return _innerEventInfo.DeclaringType; } } public override object[] GetCustomAttributes(Type attributeType, bool inherit) { return _innerEventInfo.GetCustomAttributes(attributeType, inherit); } public override object[] GetCustomAttributes(bool inherit) { return _innerEventInfo.GetCustomAttributes(inherit); } public override bool IsDefined(Type attributeType, bool inherit) { return _innerEventInfo.IsDefined(attributeType, inherit); } public override string Name { get { return _innerEventInfo.Name; } } public override Type ReflectedType { get { return _innerEventInfo.ReflectedType; } } #endregion #region private methods private static void GetDataForComInvocation(System.Reflection.EventInfo eventInfo, out Guid sourceIid, out int dispid) { object[] comEventInterfaces = eventInfo.DeclaringType.GetCustomAttributes(typeof(ComEventInterfaceAttribute), false); if (comEventInterfaces == null || comEventInterfaces.Length == 0) { // throw new InvalidOperationException("event invocation for COM objects requires interface to be attributed with ComSourceInterfaceGuidAttribute"); } if (comEventInterfaces.Length > 1) { // throw new System.Reflection.AmbiguousMatchException("more than one ComSourceInterfaceGuidAttribute found"); } Type sourceItf = ((ComEventInterfaceAttribute)comEventInterfaces[0]).SourceInterface; Guid guid = sourceItf.GUID; System.Reflection.MethodInfo methodInfo = sourceItf.GetMethod(eventInfo.Name); Attribute dispIdAttribute = Attribute.GetCustomAttribute(methodInfo, typeof(DispIdAttribute)); if (dispIdAttribute == null) { // throw new InvalidOperationException("event invocation for COM objects requires event to be attributed with DispIdAttribute"); } sourceIid = guid; dispid = ((DispIdAttribute)dispIdAttribute).Value; } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Evidence.cs
- XmlDataSourceNodeDescriptor.cs
- OrderedDictionary.cs
- ReferenceService.cs
- ComponentEvent.cs
- TaskHelper.cs
- XAMLParseException.cs
- MailWriter.cs
- ComponentChangingEvent.cs
- ClientApiGenerator.cs
- RelationshipNavigation.cs
- TableCellAutomationPeer.cs
- DefaultBindingPropertyAttribute.cs
- TextWriterTraceListener.cs
- parserscommon.cs
- MulticastNotSupportedException.cs
- entityreference_tresulttype.cs
- QueryBranchOp.cs
- PermissionSetTriple.cs
- ApplicationInfo.cs
- TdsParserStaticMethods.cs
- ClassHandlersStore.cs
- ExpressionUtilities.cs
- ClockGroup.cs
- TouchDevice.cs
- InvalidProgramException.cs
- Camera.cs
- EditorZoneBase.cs
- TemplatedWizardStep.cs
- ComplexPropertyEntry.cs
- XmlSchemaValidationException.cs
- FileInfo.cs
- SplashScreenNativeMethods.cs
- WinFormsSpinner.cs
- DSASignatureFormatter.cs
- Properties.cs
- ArgumentElement.cs
- MobileCategoryAttribute.cs
- ConnectionPoolManager.cs
- HeaderUtility.cs
- XmlAttributes.cs
- ListItemsCollectionEditor.cs
- SectionUpdates.cs
- TreeChangeInfo.cs
- Win32Native.cs
- ClientRoleProvider.cs
- FacetChecker.cs
- PageThemeBuildProvider.cs
- ListViewGroupConverter.cs
- TableLayoutColumnStyleCollection.cs
- SizeConverter.cs
- DefaultBinder.cs
- XmlSchemaAnnotation.cs
- EventPropertyMap.cs
- HttpCapabilitiesSectionHandler.cs
- EventSinkActivity.cs
- RewritingSimplifier.cs
- BitmapEffectGroup.cs
- SynchronizedDispatch.cs
- ChildTable.cs
- CaseInsensitiveHashCodeProvider.cs
- JapaneseCalendar.cs
- MailDefinition.cs
- CorrelationManager.cs
- RequestBringIntoViewEventArgs.cs
- DelegatingTypeDescriptionProvider.cs
- NamespaceInfo.cs
- ListViewCancelEventArgs.cs
- SqlConnectionPoolGroupProviderInfo.cs
- MouseActionValueSerializer.cs
- EncryptedHeader.cs
- CommandBinding.cs
- XmlAnyElementAttributes.cs
- TableCell.cs
- MultiSelector.cs
- Regex.cs
- Clause.cs
- Substitution.cs
- Identifier.cs
- AccessDataSourceView.cs
- StorageComplexTypeMapping.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- MsmqAuthenticationMode.cs
- CapabilitiesSection.cs
- Point3DKeyFrameCollection.cs
- DeviceSpecific.cs
- AttributeUsageAttribute.cs
- JoinTreeNode.cs
- TimerElapsedEvenArgs.cs
- HtmlSelect.cs
- BamlLocalizabilityResolver.cs
- XNameConverter.cs
- ActivityCodeGenerator.cs
- WebPartEventArgs.cs
- CodeNamespace.cs
- MemberMemberBinding.cs
- SafeLibraryHandle.cs
- GridViewEditEventArgs.cs
- TraceRecords.cs
- CodeTypeMember.cs