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
- XmlText.cs
- AlphaSortedEnumConverter.cs
- CommunicationException.cs
- UrlAuthFailedErrorFormatter.cs
- SqlVersion.cs
- FirewallWrapper.cs
- ToolTipService.cs
- ManagedIStream.cs
- APCustomTypeDescriptor.cs
- ActivityDesignerHighlighter.cs
- ResXBuildProvider.cs
- XmlUtf8RawTextWriter.cs
- TemplatedEditableDesignerRegion.cs
- PenThreadPool.cs
- TextSelection.cs
- TextComposition.cs
- DataFieldConverter.cs
- Hashtable.cs
- MappingItemCollection.cs
- EndEvent.cs
- ColumnMapProcessor.cs
- RegisterInfo.cs
- VectorAnimationUsingKeyFrames.cs
- InfoCardRSAOAEPKeyExchangeFormatter.cs
- ComponentChangedEvent.cs
- Substitution.cs
- DataBoundControlHelper.cs
- BamlResourceContent.cs
- Relationship.cs
- PopupRoot.cs
- DefaultTextStoreTextComposition.cs
- ResourceReferenceExpression.cs
- FocusTracker.cs
- TableCellCollection.cs
- FreezableDefaultValueFactory.cs
- IndependentAnimationStorage.cs
- ToolStripContainer.cs
- _FixedSizeReader.cs
- SpanIndex.cs
- _BufferOffsetSize.cs
- OutKeywords.cs
- ValidationHelpers.cs
- TextStore.cs
- ServerProtocol.cs
- HttpClientProtocol.cs
- ObjectDataSourceStatusEventArgs.cs
- EntityProviderFactory.cs
- UpdateTracker.cs
- DependencyPropertyConverter.cs
- QilReference.cs
- ExtensionSimplifierMarkupObject.cs
- LiteralControl.cs
- MsmqIntegrationBindingElement.cs
- DiagnosticsConfigurationHandler.cs
- AxHostDesigner.cs
- Trace.cs
- UInt32Converter.cs
- WinFormsSecurity.cs
- XslCompiledTransform.cs
- WindowsRichEdit.cs
- uribuilder.cs
- SafeNativeHandle.cs
- RuntimeEnvironment.cs
- BigInt.cs
- Preprocessor.cs
- ConnectionStringSettings.cs
- SizeIndependentAnimationStorage.cs
- XmlFileEditor.cs
- XamlParser.cs
- URI.cs
- ThreadNeutralSemaphore.cs
- FontFamily.cs
- WindowsGraphics.cs
- DataGridViewImageCell.cs
- versioninfo.cs
- DbMetaDataFactory.cs
- DataFormats.cs
- ConsoleKeyInfo.cs
- RtfToken.cs
- MemberPath.cs
- Int16KeyFrameCollection.cs
- XPathArrayIterator.cs
- VirtualDirectoryMappingCollection.cs
- XamlFilter.cs
- StylusEventArgs.cs
- XmlTypeAttribute.cs
- NotifyInputEventArgs.cs
- DbDataAdapter.cs
- ExtendLockCommand.cs
- WorkflowInstanceRecord.cs
- LookupNode.cs
- CommonRemoteMemoryBlock.cs
- XslNumber.cs
- LicFileLicenseProvider.cs
- EmbeddedMailObjectsCollection.cs
- XsdValidatingReader.cs
- ArcSegment.cs
- JoinGraph.cs
- MachineKeyConverter.cs
- HttpCapabilitiesBase.cs