Wir wissen alle, dass die Assembly mithilfe der GetCustomAttributes-Methode nach Attributen abgefragt werden kann. Ich möchte damit ein Erweiterungsmodul für meine Anwendung identifizieren. Um jedoch zu vermeiden jede Montag Laden ziehe ich einen defensiven Ansatz:So erhalten Sie benutzerdefinierte Attribute von einer Assembly, die nicht (wirklich) geladen wurde
Assembly.ReflectionOnlyLoadFrom mit mehr Details über eine Assembly zu bekommen (? Hat es meine ModuleAttribute)
wenn die ModuleAttribute gefunden, ich wird es schließlich lädt mit Assembly.LoadFrom
Leider scheint es, dass es keine Möglichkeit gibt, die Attribute aus einer Baugruppe zu bekommen, dass in die reflexions nur Kontext geladen wird:
myAssembly.GetCustomAttributes(typeof(ModuleAttribute), false)
schlägt mit einer InvalidOperationException („Es ist illegal auf den benutzerdefinierten Attributen einen Typs über ReflectionOnlyGetType geladen zu reflektieren“) und
CustomAttributeData.GetCustomAttributes(myAssembly)
mit Reflection wegen abhängigen Assemblys versagt nicht geladen werden.
So, wie die Attribute zu erhalten, ohne
- meine Anwendungsdomäne mit nutzlosen (möglicherweise schädliche) Arten verschmutzen durch Assembly.LoadFrom Aufruf
- die Notwendigkeit, alle referenzierten Assemblys für separate
- die Notwendigkeit zu laden Anwendungsdomänen (gab es einen kurzen Versuch, roch nach noch mehr PITA)
?
Dieser Ansatz mag diesen Ansatz nicht, da er auf zusätzlichen Metadaten beruht. Das ist nicht viel besser als hartes Codieren, in welchem Verzeichnis eine Assembly mit festem Dateinamen gefunden werden muss. –
Es beruht auf zwischengespeicherten Metadaten, nicht auf zusätzlichen. Sie extrahieren Metadaten aus Assemblys und speichern sie in Ihrem Cache (XML-Dateien oder was auch immer). Es ist schneller und besser als Baugruppen zu lesen. Außerdem ist dieser Ansatz wesentlich erweiterbarer, da Sie nach einiger Zeit etwas finden werden, das Sie nicht aus der Assembly extrahieren können, ohne es zu laden. –
Vielleicht bekomme ich dich nicht, aber wer erstellt den Metadaten-Cache? Es erfordert entweder den Ersteller, eine gültige Metadatenbeschreibung bereitzustellen, oder ich muss etwas früher erstellen, bevor ich versuche, das Modul zu laden. In beiden Fällen muss jemand dies tun und das Problem ist genau das gleiche –