Mal angenommen deine DLL ist wirklich so wichtig, dass niemand ran darf. Dann habe ich hier ein paar Ideen. Keine davon verhindert zu 100%, dass jemand deine DLL benutzen kann, aber sie würden schon eine Menge Leute abschrecken.
1. Theoretisch könntest du die DLL verschlüsselt speichern. Beim Starten des Programms entschlüsselst du sie in einen temporären Ordner und lädst sie dann.
2. Dann könntest du noch die Namen der Funktionen verschleiern, also einfach durch sinnlose Buchstabenkombinationen oder sogar völlig irreführende Namen ersetzen (à la "InitializeGraphics" => "SendHTTPRequestAsync").
3. Bevor du irgendeine DLL-Funktion nutzen kannst, musst du eine "Entsperr-Funktion" aufrufen, der du ein Passwort übergibst. Wenn das Passwort richtig ist, funktionieren die anderen Funktionen. Ansonsten brechen sie sofort ab. Das Passwort-Konzept kann man auch durch etwas komplizierteres ersetzen, wie eine Art Handshake/Challenge.
4. In der DllMain kannst du herausfinden, welcher Prozess deine DLL geladen hat. Nun prüfst du, ob es deine Anwendung ist oder eine andere (z.B. indem du in der "erlaubten" EXE-Datei eine bestimmte Byte-Sequenz einbaust, die von der DLL gesucht wird). Wenn es nicht deine Anwendung ist, beende den Prozess.