Прежде всего надо понимать, что абсолютной защиты не существует. Чем выше разница между ценой программы и затратами на взлом, тем быстрее её сломают. Соответственно, вы можете только затруднить процесс взлома, увеличивая этим затраты на него и снижая интерес взломщика. Но это обоюдоострое лезвие, разработка защиты процесс тоже дорогостоящий.
Затруднить декомпиляцию программы можно воспользовавшись AOT-компилятором, но это снизит переносимость программы и в некоторых сценариях использования может снизить её производительность.
Просто коннектится на какой-то адрес мало. Админа школьного класса хватит, чтобы обнаружить подключения и завернуть трафик на поддельный сервер. Надо чтобы сервер отвечал асимметрично зашифрованным сообщением, которое клиент будет расшифровывать публичным ключом. Публичный ключ, естественно, надо хранить не в ресурсах, а в момент запуска каким-либо образом собирать в GuardedString. Полезно так же зашить в код уникальный идентификатор сборки и передавать его при запросе на сервер лицензирования.