| 
        public interface IChannelReceiverHook
       | 
| ChannelScheme | Read-only | 
| ChannelSinkChain | Read-only Gets the channel sink chain that the current channel is using. | 
| WantsToListen | Read-only Gets a Boolean value indicating whether IChannelReceiverHook needs to be hooked into the outside listener service. | 
| AddHookChannelUri | Adds a URI on which the channel hook will listen. | 
| 
            string ChannelScheme {get;}
           | 
| 
            IServerChannelSink ChannelSinkChain {get;}
           | 
class CustomChannel : BaseChannelWithProperties, IChannelReceiverHook,
   IChannelReceiver, IChannel, IChannelSender {
   // TransportSink is a private class defined within CustomChannel.
   TransportSink transportSink;
   public IServerChannelSink ChannelSinkChain {
      get { return transportSink.NextChannelSink; }
   }
   // Rest of CustomChannel's implementation...
    
| 
            bool WantsToListen {get;}
           | 
| 
            void AddHookChannelUri( | 
channelUri
   class CustomChannel : BaseChannelWithProperties, IChannelReceiverHook,
                         IChannelReceiver, IChannel, IChannelSender {
      public void AddHookChannelUri(string channelUri) {
         if (channelUri != null) {
            string [] uris = dataStore.ChannelUris;
				
            // This implementation only allows one URI to be hooked in.
            if (uris == null) {
               string [] newUris = new string[1];
               newUris[0] = channelUri;
               dataStore.ChannelUris = newUris;
               wantsToListen = false;
            } else {
               string msg = "This channel is already listening for " +
                  "data, and can't be hooked into at this stage.";
               throw new System.Runtime.Remoting.RemotingException(msg);
            }
         }
      }
      // The rest of CustomChannel's implementation.