Stopping a decompilation program is simple, since they need to go from a
lower-level language like IL, to a higher-level language such as VB. There
are many things one can represent and do in IL that's not possible to
represent or do in VB. A decent obfuscator should handle this no problem.
Stopping a decompiler is neigh impossible, since one way or another, your
application has to run, and thus the data has to be around somewhere. An
encrypted loader can help some since your IL wouldn't sit around on disk.
Generally speaking, anything can be cracked. It all depends on how much
demand there is. If it's the next version of Windows, NOTHING you do will be
sufficient to stop determined crackers. You also need to weigh it against
impact against your users. Programs like SafeDisc can really screw your
users up, and provide a dubious level of protection.
Now, if you're just concerned about people understanding your code, well, an
obfuscator + encrypted loader is probably your best bet.