Собственно как один из вариантов:
некий hardware-key (например серийник материнки, биоса, hdd) от юзерской машины, участвующий в дешифрации модуля
а шифруется собственно "платная" сборка
то бишь ставится обработчик currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
и в нём дешифрация и AssemblyLoad из потока дешифрации
p.s. это вольный и сильно упрощённый пересказ реализации из коммерческих систем лицензирования для шарпа