In a clear and succinct answer, DOES NOT HOW!
I say this can not be done because of how skillful you are, you will always have someone skilled enough in reverse engineering (or other types, including social engineering) to be able to break your protection. The crack's are the most real proof of this.
What you can do is make access difficult, but there is no way to ensure 100% protection.
But then does it mean I should leave the way it is?
That depends a lot. Sometimes the work you will have to make access difficult may not be feasible due to a number of factors, such as the time and costs involved.
But then there is nothing?
Well, there are some tools to .net in particular, that helps to accomplish this process, which are:
What is your recommendation?
Do not worry too much about this, because if a person has the ability to understand and use a reverse engineering system and let the code work, it often has the ability to do an equal, and sometimes the process can be even more fast.
Now, if your problem is with system misuse, you can use a form of licenses to ensure the system is used.
Add-ons:
As a complement, I leave some questions here on the subject, two of them very much like yours.