However you will pack or obfuscate your assembly, there will always be some people on the internet who will be able to crack it.
If your program contains dynamic info received from a server, you should protect it using that server, verify if the specified user/machine is allowed to get the info, they can't crack any server-sided content (unless they hack into your server). A database is most-likely necessary to do this.
If you do not have any dynamic content (I think you should always have some, especially when using trial periods), I would go for obfuscation & if you have time, look how to make your own obfuscator, this way the cracker will need more time to crack your custom ways of obfuscating, if you use one of the popular obfuscators, crackers will have ton of programs to deobfuscate in 1 second.
If you store any information in registry or even your server, you should encrypt it.
Encrypt & try to hide the encryption methods (these are the functions you should really obfuscate).
This question has some useful answers as well.