If you are where I was a few months ago with mine, you have a long path to go, but throw everything you've got at this and you can do it!
I think it's best to use a pushing and pulling kind of method, in other words, really make him WANT to be in his bed, and also really MAKE him stay there. So, go buy new sheets (with Thomas the tank engine or something equally wonderful), and pretend for all the world that you really want those sheets. Put them on his bed, but keep lying down in them, getting all cozy. Tell him that these are the coziest sheets in the house, and pretend not to want to let him sleep in his bed. YOU want them. Even daddy can help out with this act, and pretend he wants them too. When your son is ready to climb into bed and try them out himself, be SO reluctant to get up out of them. You get the picture. :) Add this to the bedtime routine, where you pretend you want to be in his cozy, cozy sheets every night.
Then add a no-tolerance policy for getting out of bed (except for potty), with closing the door tight for longer and longer with each infraction. Plus starting bedtime when it is DARK and QUIET, when he's physically exhausted, and you've got yourself a bedtime!
More about dark -- don't try to start bedtime before sunset if you have bedtime issues. Later, after he's figured out how to put himself to sleep, you can move bedtime back. More about quiet -- put off doing dishes, chatting until after he is asleep. If you have stuff you have to get done, do it first, then start bedtime (again, this rule can be loosened later, after bedtime issues are resolved). More about physically exhausted -- make your son run off those dinner calories! Chase him all around the house after dinner, watch him do tricks, cleaning up games etc. for about 20 minutes, or until he can't be convinced to run anymore. Should do the trick.