Beim Iterieren durch einen Satz von Baugruppen, z.B. AppDomain.CurrentDomain.GetAssemblies(), dynamische Assemblies werden eine NotSuportedException auslösen, wenn Sie versuchen, auf Eigenschaften wie CodeBase zuzugreifen. Wie können Sie feststellen, dass eine Assembly dynamisch ist, ohne die NotSupportedException auszulösen und abzufangen?Wie erkennt man, ob eine .NET-Assembly dynamisch ist?
Antwort
Um zu überprüfen, ob die Baugruppe ist dynamisch:
if (assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder)
mich Dies dauerte eine Weile, um herauszufinden, ist es so hier gefragt und beantwortet.
Update:
In .NET 4.0, gibt es jetzt eine Eigenschaft:
if (assembly.IsDynamic)
In .NET 4 können Sie auch die Assembly.IsDynamic Eigenschaft überprüfen.
Endlich hat Microsoft das zur Verfügung gestellt :) Dies ist offensichtlich der Weg, von jetzt an zu gehen. –
Vor .NET Framework 4 scheint die einfachste Lösung zu sein, zu überprüfen, ob die Assembly vom Typ System.Reflection.Emit.AssemblyBuilder ist. Dies ist die Lösung, die wir in unserem Team anwenden.
Wenn Sie sich die Implementierung der CodeBase-Eigenschaft von AssemblyBuilder ansehen, wird einfach eine Ausnahme ausgelöst, unabhängig von anderen Dingen. AssemblyBuilder ist auch eine versiegelte Klasse. Daher kann eine abgeleitete Klasse dieses Verhalten nicht ändern. Wenn Sie also ein AssemblyBuilder-Objekt haben, können Sie sicher sein, dass Sie niemals CodeBase oder GetManifestResourceStream oder eine Reihe anderer Methoden aufrufen können.
public override string CodeBase
{
get
{
throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicAssembly"));
}
}
Und in .NET Framework 4, sollte die Assembly.IsDynamic Eigenschaft überprüfen vorzuziehen sein, weil es besser lesbar und vielleicht mehr zukunftssicher, falls es einige neue Klasse kommt, dass IsDynamic außer Kraft setzt. Da AssemblyBuilder.IsDynamic immer true zurückgibt, ist dies ein weiterer Beweis dafür, dass ein AssemblyBuilder-Objekt immer einer "dynamischen DLL" entspricht.
Hier ist das .NET 4 Assembly des IsDynamic:
public override bool IsDynamic
{
get {
return true;
}
}
- 1. Dynamisches Objekt - Wie erkennt man, ob eine Eigenschaft definiert ist?
- 2. Wie erkennt man, ob eine URL eine Intranet-URL ist?
- 3. Wie erkennt man, ob Bluetooth angeschlossen ist?
- 4. Wie erkennt man, ob Daydream eingeschaltet ist?
- 5. Wie erkennt man, ob SearchView erweitert ist?
- 6. Wie erkennt man, ob AVAudioRecorder pausiert ist?
- 7. Wie erkennt man, ob $ _POST gesetzt ist?
- 8. Wie erkennt man, ob ein Typ eine benutzerdefinierte Struktur ist?
- 9. Wie erkennt man, ob eine EXE WPF ist
- 10. Wie erkennt man, ob eine Datei PDF oder TIFF ist?
- 11. Wie erkennt man, ob ein bestimmtes Laufwerk eine Festplatte ist?
- 12. Wie erkennt man, ob ein Eingabefeldwert eine Maske ist?
- 13. WIX: Wie erkennt man, ob eine Drittanbieter-Anwendung installiert ist?
- 14. Wie erkennt man, ob eine F # -Funktion rein ist?
- 15. Wie erkennt man, ob eine Zeichenfolge mindestens eine Zahl enthält?
- 16. Wie erkennt man, ob ein Drucker mit pyqt verbunden ist?
- 17. Wie erkennt man, ob "& t_Co" in meiner .vimrc "definiert" ist?
- 18. Wie erkennt man, ob der Ordner geöffnet ist?
- 19. Wie erkennt man, ob ein Datei-Handle ein Socket ist?
- 20. Qt: Wie erkennt man, ob ein Widget ausgewählt ist?
- 21. Wie erkennt man am besten, ob Excel 2003 installiert ist?
- 22. Wie erkennt man, ob der aktuelle Frame übergeordnet ist?
- 23. Wie erkennt man, ob Socket in PHP geöffnet ist?
- 24. Wie erkennt man, ob der Safari-Energiesparmodus aktiviert ist?
- 25. Wie erkennt man, ob actionmode bereits vorhanden ist
- 26. iPhone: Wie erkennt man, ob iTunes spielt?
- 27. Wie erkennt man, ob ein OpenGL-Kontext Hardware-beschleunigt ist?
- 28. Wie erkennt man, ob Rails an der Root-URL ist?
- 29. Wie erkennt man, ob das Objekt in PHP traversierbar ist?
- 30. Wie erkennt man, ob die Navigationsleiste geöffnet ist?
Nicht ganz richtig. Ein Modulhersteller kann "nicht dynamisch" sein. Sie sollten 'ModuleBuilder.IsTransient' verwenden, um nach 'dynamisch' zu suchen. – leppie