In this chapter you have seen how you can leverage the .NET Remoting Framework's extensibility. You should now be able to apply the internals shown in Chapters 7 and 8 to extend and customize the .NET Remoting programming model to suit your needs.
You now know the differences between IMessageSink, which is used before the message reaches the client-side formatter, and IClientChannelSink, which is used after the serialization of the IMessage object. You know that you can add properties to the IMessage object's LogicalCallContext to pass it to the server, where it can be read by an IServerChannelSink, and you can also encrypt or compress a request by using a combination of IClientChannelSinks and IServerChannelSinks.
You also learned how sink providers are developed, and that a client-side IMessageSink has to be created by an IClientChannelSinkProvider as well and therefore has to implement the IClientChannelSink's methods.Finally, you read about custom proxies, which allow you to implement additional functionality before the message reaches the chain of sinks.
In the next chapter, you get a chance to use the knowledge gained here to implement a complete transport channel from scratch.