Um zum Thema zu kommen:
Ein Dongle (=Hardware-Schutz) scheint also ausreichend zu sein. Ich gehe davon aus, das die Routine möglichst oft aufgerufen werden und der Code am durch einen Obfuscator geschützt werden sollte.
Nur, wenn man ihn richtig einbaut. Es hilft nix, wenn nur einmal am Anfang geprüft wird ob der Dongle da ist. Das kann man leicht rauspatchen. Die gängigen Schutzsysteme nehmen Code aus dem Assembly, verschlüsseln ihn so, dass er nur mittels der Hardware auf dem Dongle entschlüsselt werden kann (in aller Regel Public/Private Key Verfahren, also hinreichend sicher), und somit muss immer, wenn auf bestimmte Funktionen zugegriffen wird der Dongle erstmal den Teil des Codes entschlüsseln. Lediglich Obfuskierter, aber nicht verschlüsselter Code ist mit Assembler zu vergleichen. Das macht auch keinen Spass sich da durch zu wühlen, aber es ist durchaus machbar. Die Hardware-Verschlüsselung ist dann die Komponente, die es deutlich sicherer macht. Steht und fällt natürlich damit, dass der Anbieter dessen Lösung Du wählst so arbeitet, dass der Dongel nicht gehackt werden kann, denn sonst emuliert jemand den und dann hat sich das auch.
Das ganze geht natürlich ein klein wenig auf die Performance, aber letztlich ist man nur hierdurch wirklich geschützt, denn der Aufwand an den entschlüsselten (obfuskierten) Code zu kommen ist schon so hoch, dass man sich dann nicht noch mit dem reverse Engineering des codes auseinander setzen will.