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
- TemplateField.cs
- SQLBinary.cs
- TypeCollectionPropertyEditor.cs
- DetailsViewInsertEventArgs.cs
- EncoderBestFitFallback.cs
- ConvertEvent.cs
- Base64Decoder.cs
- XmlSerializerVersionAttribute.cs
- LinkedResource.cs
- DeferrableContentConverter.cs
- EncodingFallbackAwareXmlTextWriter.cs
- QuotedStringWriteStateInfo.cs
- MetadataItem_Static.cs
- path.cs
- ContextMarshalException.cs
- ThemeInfoAttribute.cs
- SqlConnectionHelper.cs
- _ProxyRegBlob.cs
- ScriptManagerProxy.cs
- XmlDataProvider.cs
- WeakReferenceKey.cs
- PtsContext.cs
- CustomAttributeFormatException.cs
- BaseTemplateParser.cs
- SqlFileStream.cs
- ViewBox.cs
- TouchEventArgs.cs
- XsdBuilder.cs
- FormsAuthenticationCredentials.cs
- xml.cs
- DataSourceConverter.cs
- PlatformCulture.cs
- ProvidePropertyAttribute.cs
- Matrix.cs
- CodeSnippetStatement.cs
- ToolStripButton.cs
- OleDbMetaDataFactory.cs
- SqlCaseSimplifier.cs
- TraceHandlerErrorFormatter.cs
- ThreadLocal.cs
- initElementDictionary.cs
- CFGGrammar.cs
- MaterialGroup.cs
- GradientBrush.cs
- ConsoleTraceListener.cs
- ResourceDictionary.cs
- HelpFileFileNameEditor.cs
- AncillaryOps.cs
- HtmlElementEventArgs.cs
- SettingsProviderCollection.cs
- OnOperation.cs
- GridItemCollection.cs
- EntityDataSourceContextDisposingEventArgs.cs
- IImplicitResourceProvider.cs
- CategoryEditor.cs
- FixedPageStructure.cs
- DllNotFoundException.cs
- Point.cs
- SafeFindHandle.cs
- MarkupObject.cs
- DataGridTemplateColumn.cs
- DataObjectAttribute.cs
- WebControl.cs
- ThreadSafeList.cs
- SqlClientPermission.cs
- IntPtr.cs
- SmtpException.cs
- WebConfigurationHostFileChange.cs
- BaseDataBoundControl.cs
- SafeFileMapViewHandle.cs
- WebControlToolBoxItem.cs
- ELinqQueryState.cs
- StaticSiteMapProvider.cs
- ConfigXmlAttribute.cs
- DBSchemaRow.cs
- FileSecurity.cs
- GetBrowserTokenRequest.cs
- PropagationProtocolsTracing.cs
- ReadOnlyHierarchicalDataSource.cs
- TaiwanCalendar.cs
- SrgsElement.cs
- MouseWheelEventArgs.cs
- SmtpNtlmAuthenticationModule.cs
- SafeRightsManagementHandle.cs
- IPEndPoint.cs
- TokenBasedSetEnumerator.cs
- TransactionManager.cs
- Documentation.cs
- HttpCacheVaryByContentEncodings.cs
- Rect3DValueSerializer.cs
- WorkflowMessageEventHandler.cs
- DecoderReplacementFallback.cs
- ObjectDataSourceMethodEventArgs.cs
- SafeNativeMethodsCLR.cs
- DecoderReplacementFallback.cs
- TransformConverter.cs
- AtomicFile.cs
- ServiceManager.cs
- SyntaxCheck.cs
- XPathParser.cs