Custom wrapper classes are used to bridge the two interfaced defined in the previous step. A custom marshaler typically requires two wrapper classes; one for handling calls from managed to unmanaged and another for handling calls from unmanaged to managed. The wrappers typically cache a reference to one interface and implement the other interface.
Sections 3.3 and 3.4 cover each wrapper.