/// <summary>
        /// Execution entry point.
        /// </summary>
        public static void Main()
        {
            // Create an instance of a type that offers an event.
            TypeWithWeakDelegateEvent twwde = new TypeWithWeakDelegateEvent();

            // Create an instance of a type that will register with the event.
            s_someType = new SomeType();

            // Register this object's SomeEventGotRaised method with our the other 
            // object's event.
            twwde.SomeEvent += s_someType.SomeEventGotRaised;

            // Raising the event calls through the delegate.
            twwde.RaiseSomeEvent("Before GC; this appears");

            // As long as a strong reference to the SomeType object exists, it will 
            // not be collected, and every call to RaiseSomeEvent will call the 
            // SomeType object's SomeEventGotRaised method.

            // However, if no strong reference to the SomeType object exists and 
            // garbage collection occurs, future calls to RaiseSomeEvent will NOT 
            // call the SomeType object's SomeEventGotRaised method, because the 
            // object no longer exists in memory.  No exception is raised, because 
            // that is not an error condition.

            // To demonstrate this, set s_someType to null and force garbage 
            // collection to occur.
            s_someType = null;
            Debug.GC(true);

            // Now the SomeType object no longer exists. Raising an event will not 
            // produce output.
            twwde.RaiseSomeEvent("After GC; this doesn't appear");

            Debug.Print("Program ending");
        }
        /// <summary>
        /// Execution entry point.
        /// </summary>
        public static void Main()
        {
            // Create an instance of a type that offers an event.
            TypeWithWeakDelegateEvent twwde = new TypeWithWeakDelegateEvent();

            // Create an instance of a type that will register with the event.
            s_someType = new SomeType();

            // Register this object's SomeEventGotRaised method with our the other
            // object's event.
            twwde.SomeEvent += s_someType.SomeEventGotRaised;

            // Raising the event calls through the delegate.
            twwde.RaiseSomeEvent("Before GC; this appears");

            // As long as a strong reference to the SomeType object exists, it will
            // not be collected, and every call to RaiseSomeEvent will call the
            // SomeType object's SomeEventGotRaised method.

            // However, if no strong reference to the SomeType object exists and
            // garbage collection occurs, future calls to RaiseSomeEvent will NOT
            // call the SomeType object's SomeEventGotRaised method, because the
            // object no longer exists in memory.  No exception is raised, because
            // that is not an error condition.

            // To demonstrate this, set s_someType to null and force garbage
            // collection to occur.
            s_someType = null;
            Debug.GC(true);

            // Now the SomeType object no longer exists. Raising an event will not
            // produce output.
            twwde.RaiseSomeEvent("After GC; this doesn't appear");

            Debug.Print("Program ending");
        }