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
- DependsOnAttribute.cs
- CompositionAdorner.cs
- PageClientProxyGenerator.cs
- AccessDataSourceView.cs
- TransformGroup.cs
- CodeNamespaceImportCollection.cs
- DeploymentSection.cs
- EntityEntry.cs
- EncryptedPackage.cs
- LinqDataSourceUpdateEventArgs.cs
- CommonGetThemePartSize.cs
- SmtpSection.cs
- SplitterCancelEvent.cs
- WebSysDefaultValueAttribute.cs
- AttributeEmitter.cs
- HierarchicalDataTemplate.cs
- XmlTextReader.cs
- MemoryStream.cs
- ZipFileInfo.cs
- XmlArrayItemAttributes.cs
- _AutoWebProxyScriptEngine.cs
- AnnotationResource.cs
- EncryptedReference.cs
- ResizeGrip.cs
- SyndicationSerializer.cs
- DeobfuscatingStream.cs
- DesignerSerializerAttribute.cs
- SqlDataAdapter.cs
- StreamSecurityUpgradeAcceptorAsyncResult.cs
- XmlBinaryWriter.cs
- DecimalAnimation.cs
- QuadraticBezierSegment.cs
- CompleteWizardStep.cs
- CancelEventArgs.cs
- SmtpNtlmAuthenticationModule.cs
- FormViewActionList.cs
- Int64.cs
- WindowsClientElement.cs
- ExpressionParser.cs
- ColorTransform.cs
- StreamAsIStream.cs
- DataShape.cs
- MetaTable.cs
- SchemaConstraints.cs
- BufferModesCollection.cs
- Point.cs
- SecurityContextSecurityToken.cs
- HtmlInputReset.cs
- mediaeventshelper.cs
- ContentDisposition.cs
- HandlerElementCollection.cs
- BitArray.cs
- PingOptions.cs
- CodeExpressionStatement.cs
- CalendarData.cs
- XmlSchemaComplexContent.cs
- DatatypeImplementation.cs
- DataFormats.cs
- ClientBuildManager.cs
- StringValidator.cs
- BulletedListEventArgs.cs
- CasesDictionary.cs
- OrderingQueryOperator.cs
- SoapRpcServiceAttribute.cs
- HttpAsyncResult.cs
- NetMsmqSecurity.cs
- AvtEvent.cs
- FontStyleConverter.cs
- CompilerLocalReference.cs
- XmlReader.cs
- ProfileGroupSettings.cs
- LOSFormatter.cs
- HttpException.cs
- CannotUnloadAppDomainException.cs
- ThicknessAnimation.cs
- UpdatePanelTriggerCollection.cs
- DataGridViewTopLeftHeaderCell.cs
- NetworkCredential.cs
- ConstrainedDataObject.cs
- RequestCacheManager.cs
- HotSpot.cs
- IxmlLineInfo.cs
- PeekCompletedEventArgs.cs
- DataGridViewRowPostPaintEventArgs.cs
- serverconfig.cs
- DirectoryNotFoundException.cs
- AnnouncementSendsAsyncResult.cs
- InternalConfigSettingsFactory.cs
- TypeLibraryHelper.cs
- SoapSchemaExporter.cs
- TypeConverterHelper.cs
- BindingBase.cs
- CompoundFileDeflateTransform.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- TemplateField.cs
- DataGridViewColumnHeaderCell.cs
- OAVariantLib.cs
- WindowsSpinner.cs
- Translator.cs
- OutputBuffer.cs