public void RemoveHandler(int dispid, object func) { string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); lock (_lockObject) { ComEventSinkMethod sinkEntry = FindSinkMethod(name); if (sinkEntry == null) { throw Error.RemovingUnregisteredHandler(); } // Remove the delegate from multicast delegate chain. // We will need to find the delegate that corresponds // to the func handler we want to remove. This will be // easy since we Target property of the delegate object // is a ComEventCallContext object. Delegate[] delegates = sinkEntry._target.GetInvocationList(); foreach (Delegate d in delegates) { ComEventCallContext callContext = d.Target as ComEventCallContext; if (callContext != null && callContext._func.Equals(func)) { sinkEntry._target = Delegate.Remove(sinkEntry._target, d); break; } } // If the delegates chain is empty - we can remove // corresponding ComEvenSinkEntry if (sinkEntry._target == null) { _comEventSinkMethods.Remove(sinkEntry); } // We can Unadvise from the ConnectionPoint if no more sink entries // are registered for this interface //(calling Dispose will call IConnectionPoint.Unadvise). if (_comEventSinkMethods.Count == 0) { // notice that we do not remove // ComEventSinkEntry from the list, we will re-use this data structure // if a new handler needs to be attached. Dispose(); } } }
public void AddHandler(int dispid, object func) { string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); ComEventCallHandler handler = new ComEventCallContext(func).Call; lock (_lockObject) { ComEventSinkMethod sinkMethod; sinkMethod = FindSinkMethod(name); if (sinkMethod == null) { if (_comEventSinkMethods == null) { _comEventSinkMethods = new List <ComEventSinkMethod>(); } sinkMethod = new ComEventSinkMethod(); sinkMethod._name = name; _comEventSinkMethods.Add(sinkMethod); } sinkMethod._target = Delegate.Combine(sinkMethod._target, handler); } }
public void AddHandler(int dispid, object func) { string name = String.Format(CultureInfo.InvariantCulture, "[DISPID={0}]", dispid); ComEventCallHandler handler = new ComEventCallContext(func).Call; lock (_lockObject) { ComEventSinkMethod sinkMethod; sinkMethod = FindSinkMethod(name); if (sinkMethod == null) { if (_comEventSinkMethods == null) { _comEventSinkMethods = new List<ComEventSinkMethod>(); } sinkMethod = new ComEventSinkMethod(); sinkMethod._name = name; _comEventSinkMethods.Add(sinkMethod); } sinkMethod._target = Delegate.Combine(sinkMethod._target, handler); } }