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
- ConfigUtil.cs
- GeometryValueSerializer.cs
- QueryParameter.cs
- KnownTypes.cs
- HandlerWithFactory.cs
- ExpandedWrapper.cs
- SystemIcmpV4Statistics.cs
- WmlTextBoxAdapter.cs
- Stream.cs
- SystemGatewayIPAddressInformation.cs
- sqlser.cs
- EntityDesignerUtils.cs
- CatchBlock.cs
- ByteStreamMessageEncoder.cs
- XmlSerializerVersionAttribute.cs
- RootCodeDomSerializer.cs
- Oid.cs
- DocumentViewerAutomationPeer.cs
- RootBuilder.cs
- Cloud.cs
- LicenseContext.cs
- ConfigurationSchemaErrors.cs
- XmlSchema.cs
- _NestedMultipleAsyncResult.cs
- SQLInt16Storage.cs
- StorageRoot.cs
- LambdaCompiler.Logical.cs
- ImageConverter.cs
- LayoutDump.cs
- DependencyPropertyValueSerializer.cs
- DataGridViewDataErrorEventArgs.cs
- StreamGeometry.cs
- SqlEnums.cs
- MissingMemberException.cs
- XmlDeclaration.cs
- Int32KeyFrameCollection.cs
- RecipientIdentity.cs
- PropertyEmitter.cs
- DesignerActionMethodItem.cs
- DataRow.cs
- XmlDataDocument.cs
- Win32KeyboardDevice.cs
- CornerRadiusConverter.cs
- ReferenceEqualityComparer.cs
- HijriCalendar.cs
- SafeHandle.cs
- DataGridViewCellLinkedList.cs
- XamlStyleSerializer.cs
- UIAgentRequest.cs
- RichTextBoxContextMenu.cs
- MenuItemCollection.cs
- PropertyRef.cs
- columnmapkeybuilder.cs
- DataSourceUtil.cs
- SqlDataSourceRefreshSchemaForm.cs
- XmlEncoding.cs
- ClassImporter.cs
- JournalEntry.cs
- ErrorEventArgs.cs
- AutomationEventArgs.cs
- ResourcePool.cs
- Script.cs
- HttpDebugHandler.cs
- MultiDataTrigger.cs
- WebPartPersonalization.cs
- EventTrigger.cs
- TypeExtension.cs
- ScriptResourceInfo.cs
- SingleStorage.cs
- ProxyFragment.cs
- SmiContext.cs
- MsmqReceiveParameters.cs
- OdbcConnectionOpen.cs
- RenderingEventArgs.cs
- DependencyPropertyKey.cs
- XmlLoader.cs
- DictionaryTraceRecord.cs
- InputLanguage.cs
- QuaternionAnimation.cs
- PointConverter.cs
- DataConnectionHelper.cs
- PersistChildrenAttribute.cs
- NeutralResourcesLanguageAttribute.cs
- EventHandlerList.cs
- UiaCoreProviderApi.cs
- LayoutInformation.cs
- DesignTimeTemplateParser.cs
- MultipartIdentifier.cs
- SiteMapProvider.cs
- TextClipboardData.cs
- XmlCharCheckingWriter.cs
- ConfigsHelper.cs
- WindowsGraphicsWrapper.cs
- ToolStripSettings.cs
- IdleTimeoutMonitor.cs
- CodeTypeReference.cs
- XmlNotation.cs
- Light.cs
- XmlBindingWorker.cs
- ElementHostPropertyMap.cs