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
- BamlRecordWriter.cs
- GeneralTransform3DTo2DTo3D.cs
- ThreadAbortException.cs
- RectAnimationBase.cs
- SqlDependency.cs
- IndexedString.cs
- HtmlEmptyTagControlBuilder.cs
- RowToParametersTransformer.cs
- RecipientInfo.cs
- WeakEventManager.cs
- CharEntityEncoderFallback.cs
- ReadOnlyPropertyMetadata.cs
- ParentUndoUnit.cs
- ProfessionalColors.cs
- Empty.cs
- ProviderUtil.cs
- MessageDecoder.cs
- Publisher.cs
- XmlValueConverter.cs
- NullEntityWrapper.cs
- FileAuthorizationModule.cs
- CryptoStream.cs
- ForwardPositionQuery.cs
- StringExpressionSet.cs
- ContentElementAutomationPeer.cs
- VersionValidator.cs
- LoginAutoFormat.cs
- RangeValueProviderWrapper.cs
- ThaiBuddhistCalendar.cs
- Section.cs
- ByteArrayHelperWithString.cs
- WebPartDisplayModeEventArgs.cs
- CroppedBitmap.cs
- Util.cs
- MessageSecurityOverTcpElement.cs
- WebScriptEnablingElement.cs
- InvalidOperationException.cs
- TextRangeEdit.cs
- UserControlDocumentDesigner.cs
- MultilineStringConverter.cs
- AttributeUsageAttribute.cs
- StaticDataManager.cs
- DetailsViewPagerRow.cs
- TokenBasedSetEnumerator.cs
- VectorAnimation.cs
- RecommendedAsConfigurableAttribute.cs
- ScrollItemPattern.cs
- ListItemCollection.cs
- TraceSource.cs
- Scene3D.cs
- EditBehavior.cs
- StdRegProviderWrapper.cs
- MasterPageCodeDomTreeGenerator.cs
- XmlSerializableServices.cs
- RewritingSimplifier.cs
- CssClassPropertyAttribute.cs
- Image.cs
- DataGridViewAccessibleObject.cs
- MetafileHeaderWmf.cs
- DataSourceView.cs
- HybridCollection.cs
- ProviderIncompatibleException.cs
- HashMembershipCondition.cs
- SplineKeyFrames.cs
- ArrangedElement.cs
- SerializationInfo.cs
- ListViewDataItem.cs
- XmlCompatibilityReader.cs
- DbException.cs
- KeyNotFoundException.cs
- ThreadStaticAttribute.cs
- _NtlmClient.cs
- BinaryEditor.cs
- TypeDescriptionProvider.cs
- AsnEncodedData.cs
- ObjectView.cs
- GridEntryCollection.cs
- Model3DGroup.cs
- DiagnosticTraceSource.cs
- EditorPart.cs
- ParameterCollection.cs
- SafeFreeMibTable.cs
- MethodResolver.cs
- AspNetSynchronizationContext.cs
- FormsAuthenticationUser.cs
- addressfiltermode.cs
- MsmqInputMessage.cs
- VScrollBar.cs
- SoapObjectReader.cs
- TreeSet.cs
- FirstQueryOperator.cs
- HashCodeCombiner.cs
- PartialToken.cs
- ZoneLinkButton.cs
- XamlReaderHelper.cs
- ExpressionNode.cs
- HashStream.cs
- invalidudtexception.cs
- FormViewInsertEventArgs.cs
- RangeExpression.cs