Beispiel #1
0
        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();
                }
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
            }
        }