When more control is required than is available using the precompiled resource type. such as when you need to add extension properties or change the defaults.
When the source code needs to be modified to add special functions.
When you want to use multiple process trees.
When you want to use non-network-aware applications.