Чем вы защищаете сборку .NET (c#)?
Единственный надежный и простой вариант это выносить критичный код в нативные сборки и pinvok-ать их либо на c++/cli сделать обертки. С обфускатором может возникнуть куча проблем, например если вы используете remouting или wpf.
Посмотрите SmartAssembly. Его многие используют.