Does anyone else find it annoying that this behaviour is implemented via a base class? This is somewhat restrictive when only single inheritance is available. Why not go the way of serialization, and have a MarhalByRefAttribute for "standard" by-ref marshalling, and an interface IMarshal for custom marshalling (sound familiar)? For backwards compatability, there could also be a MarshalByRefObject class which implements IMarshal in exactly the same way as the CLR would on seeing the attribute. Perhaps both could use static methods in a MarshalByRefHelper class, as these might also be useful to developers implementing IMarshal themselves?

As an aside, the same holds true for ContextBoundObject, and maybe even ServicedComponent. However, as I use them less often it's not such a big deal - for me at least.