Generally there is no way to protect .NET software from craking it. It is too easy (especially using Reflector). So you need to perform some steps to be able to protect to some degree:
- Obfuscate the code (often very non-trivial task as you cannot obfuscate public interfaces exposed to reference them).
- If the software is a development component it can be protected using built-in .NET Licensing (by using .licx files in Visual Studio). One company the helps with this: http://www.infralution.com/
- User registration server (this won't protect from cracking, but will protect from "non-licensed" usage).
In any case Obfuscation is the main step as it is the only one thing that puts .NET assemblies closer to native binaries.