The primary thing regarding combining Code Protection with obfuscation is - (as you've identified) that any obfuscation take place before the code protection.
In general, we recommend using integrated protection via http://www.inishtech.com/KB12 if possible, as it allows one to make the protection an intrinsic part of the build cycle rather than something that takes an extra click that either Makes You Think or can end up being skipped.
In order to fulfill the two aforementioned aims, one would ideally want to have an obfuscation system that integrates into the MSBuild compilation flow, rather than something that requires you to do a manual step at some point in every compile for test or release. Whether this is possible (it pretty much universally is) and how clean this is will depend on the specific obfuscator.
Our aim is to fit with any obfuscation solution of your choosing - our MSBuild integration allows one to Protect your code transparently as part of the MSBuild flow and hence should not impose any constraints on your selection of an obfuscation product. Even if that were not the case, you can still use our Command Line protection (see http://www.inishtech.com/KB2 ) to integrate with your obfuscator appropriately (our MSBuild integration is build on top of our standard Command Line Protection)
Hopefully other readers will take the time to submit a quick summary of approaches/packages that they use (and/or stuff they had to rule out). (Note: We deliberately didnt answer right away in order to allow others who will have far more direct experience of the tradeoffs in choosing an obfuscator to step in with up to date information including key factors in their decision making process)