Customers do not really care about the source code, or what tools you are using to write the software's source code. The main thing that
must be provided is the dependency of the executable. If the executable needs something (such as a dll for a library), it must be made available. If you do not want to share the libraries, then make sure that the execute can run natively — without the need of a runtime or library, which in .NET framework is really very tough job and you also lose much of portability.
So, if your project is referencing a dll file, it must be shared, otherwise program won't even (start to) execute. If you really want to do this, you can try to embed those code snippets inside the executable; or use the resources and embed them there — I wonder if this is even possible.
If you want to make it harder to decompile (in .NET of course), you may want to use some other services, such as
Dotfuscator[
^], that would let you to make it difficult for the end user to decompile the libraries or other software packages that are delivered to their machines. But know this, they can still decompile maximum of the assemblies.
If the assemblies, that you wrote depend on other assemblies, then there are licenses applied to them as well. Make sure, you abide to follow those licenses as well — such as, share the software as-is. Finally, the user can still have his/her chance to break the code and see what is written there.
Reflection on other hand, does not guarantee that you can simply get away and not have the code decompiled. Reflection has other uses, and... Well, it was just not used properly in your case. :-)