Sappiamo tutti che l'assembly può essere interrogato per gli attributi utilizzando il metodo GetCustomAttributes. Voglio usarlo per identificare un modulo di estensione per la mia applicazione. Tuttavia, per evitare di caricare ogni assemblea preferisco un approccio difensivo:Come ottenere attributi personalizzati da un assembly che non è (realmente) caricato
utilizzando Assembly.ReflectionOnlyLoadFrom per avere maggiori dettagli su un assembly (? Ha la mia ModuleAttribute)
se il ModuleAttribute viene trovato, mi finalmente caricarlo usando Assembly.LoadFrom
Purtroppo sembra che non v'è alcun modo per ottenere gli attributi da un gruppo, che viene caricato nel contesto riflessione sola:
myAssembly.GetCustomAttributes(typeof(ModuleAttribute), false)
riesce con un InvalidOperationException ("È illegale riflettere sugli attributi personalizzati di un tipo caricata tramite ReflectionOnlyGetType") e
CustomAttributeData.GetCustomAttributes(myAssembly)
riesce con ReflectionTypeLoadException causa di assembly dipendenti non caricata.
Così come ottenere gli attributi senza
- inquinare il mio dominio di applicazione con i tipi inutili (forse dannoso) chiamando Assembly.LoadFrom
- la necessità di caricare tutti gli assembly referenziati
- la necessità di separata domini applicativi (dato un breve tentativo, puzzava ancora di più PITA)
?
Non mi piace questo approccio, perché si basa su ulteriori metadati. Questo non è molto meglio di hard coding in cui deve essere localizzato un assembly con un nome di file fisso. –
Si basa su metadati memorizzati nella cache, non aggiuntivi. Estrai i metadati dagli assembly e li memorizzi nella tua cache (file XML o altro). È più veloce e migliore della lettura degli assiemi. Inoltre, questo approccio è molto più estensibile perché dopo un po 'di tempo si finirà con qualcosa, non sarà possibile estrarre dall'assembly senza caricarlo. –
Forse non ti capisco, ma chi sta creando la cache dei metadati? Richiede al creatore di fornire una descrizione di metadati valida o me di crearlo un po 'prima prima di provare a caricare il modulo. In entrambi i casi, qualcuno dovrà fare questo e il problema è esattamente lo stesso –