Vor einiger Zeit stand ich vor dem Problem, dass ich in einer Assembly feststellen musste, wo ich denn jetzt eigentlich laufe, um davon dann meine Weiterverarbeitung innerhalb der Assembly abhängig zu machen. Das hört sich erst einmal komisch an, lag aber daran, dass ich hier eine komplett autarke Komponente nicht wieder von anderen Assemblies abhängig machen wollte. In diesem Fall gab es dann auch gleich mehrere Möglichkeiten:
- innerhalb einer von mir geschriebenen Anwendung
- innerhalb einer von einem mir unbekannten Entwickler geschriebenen Anwendung (z.B. Konsole oder Desktop)
- innerhalb des Unittest Runners
Die von mir geschriebene Anwendung besitzt natürlich einen Strong Name und zwar genau wie meine unabhängige Assembly. D.h. also, dass ich einfach den Public Key des aufrufenden Prozesses (eigene Anwendung, unbekannte Anwendung, Unittest Runner) mit dem Public Key meiner Assembly vergleichen kann und damit ganz einfach dieses Problem lösen konnte. Über Reflection kommt man auch relativ einfach an die entsprechenden Informationen, die man dafür braucht, heran.
Die folgende Methode ist dabei entstanden und liefert true zurück, wenn der Code der Assembly innerhalb einer von mir signierten Anwendung (Prozess) läuft. In allen anderen Fällen wird ein false zurückgeliefert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/// <summary> /// Checks whether the currently running process is signed with my key pair. It compares /// the public key of the currently running parent process. /// </summary> /// <remarks> /// If this method is used during Unittests, this check will return <c>false</c>, because the /// Unittest runner process is not signed with my key pair! /// </remarks> /// <returns><c>true</c> if the currently running process is signed with my key pair; otherwise <c>false</c>.</returns> public bool IsSignedProcess() { // get PublicKey from this assembly var currentAssemblyName = Assembly.GetAssembly(typeof(Licensing)).GetName(); var currentPublicKey = currentAssemblyName.GetPublicKey(); // retrieve the PublicKey from the current process var processFileName = Process.GetCurrentProcess().MainModule.FileName; var processName = Assembly.ReflectionOnlyLoadFrom(processFileName).GetName(); var processPublicKey = processName.GetPublicKey(); return currentPublicKey.SequenceEqual(processPublicKey); } |
Ist eigentlich ganz einfach und funktioniert bei mir ohne Probleme. Den entsprechenden Unittest erspare ich euch hier an dieser Stelle aber einfach einmal. Solltet ihr dennoch daran Interesse haben, dann einfach einen Kommentar hinterlassen und ich trage ihn noch schnell nach :-).