Some kind of dongle is definitely required, but wouldn't someone be able to read the code to our app, remove the dongle-checking part, and then copy it all they want?
We do have a way to keep the code encrypted until we run it, but we have to ship the key with the code...