Wie um zu überprüfen, ob eine bestimmte assembly vorhanden ist?
Ich bin mit der Activator
zu instanziieren, eine neue Klasse basierend auf dem kurzen Namen einer assembly (e.ein. 'CustomModule'). Es wirft ein FileNotFoundException
, weil die Baugruppe nicht vorhanden ist. Gibt es eine Möglichkeit zu überprüfen, ob eine bestimmte assembly-Namen vorhanden ist?
Ich bin mit dem folgenden code:
System.Runtime.Remoting.ObjectHandle obj =
System.Activator.CreateInstance(assemblyName, className);
Hauptziel ist der test eher für die Anwesenheit der Versammlung als zu warten, bis die exception auftreten.
- Du meinst geladen in der aktuellen app-Domäne? Was ist
assemblyName
? Ein vollqualifizierter AssemblyName oder eine physische Datei-Pfad? - das einzige was ich weiß ist, dass ich ein "CustomModule" in meiner Datenbank. Wenn ein CustomModule.dll ist in meinen Papierkorb oder GAC (!?) als es die angegebene Klasse, die von Klassenname.
- Siehe mein neuestes update, hoffentlich ist das genug, um weiterzumachen.
- Hm... den .Net 1.1 Methode verwendet Versammlung.LoadWithPartialName zurückgeben, 'null', wenn die Baugruppe nicht vorhanden ist.
- (?) Ja, wenn die Baugruppe nicht vorhanden ist, dann bekommen Sie
null
, aber du hast schon alles getan, was in der Prüfung können Sie (vorausgesetzt, Sie verabschiedet den code in meiner Antwort), also ist dann die Zeit, um dasFileNotFoundException
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie bemerken, mein Kommentar auf deine Frage wird es ersichtlich werden, dass ich nicht bin Recht sicher, dass genau wie Sie wollen oder müssen gehen über diese, aber bis wir eine ausführlichere Beschreibung, die ich dir bieten kann, ist dies in der Hoffnung es passt gut zu Ihrer situation (der Schlüssel ist in der 'Suche' die Assemblys):
.NET 2.0-Kompatibel Code
Wenn Sie ermitteln möchten, ob die Datei existiert, bevor Sie versuchen, es zu laden (gute Praxis), da haben Sie seinen Namen und wissen, die gewünschte Position, einfach versuchen, die Datei zu finden, wenn die assembly aufgelöst wird:
null
, aber du hast schon alles getan, was in der Prüfung können Sie (vorausgesetzt, Sie verabschiedet den code in meiner Antwort), also ist dann die Zeit, um dasFileNotFoundException
.AssemblyResolve
Methode sollte genauso arbeiten wie vorgesehen - nicht sicher ist, was dort passiert. Ein Hinweis könnte sein, nur passieren diedll
DateinamenCreateInstance
und bauen Sie den vollständigen Pfad in derAssemblyResolve
event-handler.Ich denke, es ist besser, nicht zu versuchen zu vermeiden, die Ausnahme. Der Grund ist, dass, wenn Sie code wie
es ist immer ein Risiko, in einer pre-emptive multitasking-Betriebssystem, dass die Montage kann Hinzugefügt werden/entfernt, zwischen dem check und dem eigentlichen Schöpfung. Ja, ich weiß, das Risiko ist minimal, aber ich denke immer noch die Ausnahme Variante sieht besser aus, weil es atomar ist.
Fehlende assembly definitiv eine Ausnahme bildet, try/catch -
FileNotFoundException
und behandeln die situation wie pro Ihre Logik.Ich hoffe, es wird Ihnen helfen, für jemanden, der in der Zukunft:
Auf jeden externe .dll, die Sie verwenden, erstellen Sie Ihre eigenen eindeutigen Schlüssel, etwa so:
string key = "fjrj3288skckfktk4owoxkvkfk4o29dic";
Dann, wenn Sie laden Sie Ihre form, für jede einzelne externe .dll, die Sie haben, einfach prüfen ob der Schlüssel existiert, etwa so:
Wenn(isMyLib.Variablen.key == key)
//weiter
anderes
//.dll nicht vorhanden oder beschädigt ist.