2011-12-19 6 views
9

Ive stato alla ricerca in tutto il mondo per una possibile soluzione a questo, ma non riesco a trovare una risposta. Il mio problema è che ho alcune classi che devono essere completamente nascoste da Assembly.getTypes, dato che sto scrivendo un plugin per un'applicazione, e sto raccogliendo i tipi che ho bisogno di rimanere nascosto (questo accade anche se sono dichiarati come classi private o interne).Nascondere tipi vengano elencati in Assembly.GetTypes in .net

Qualcuno sa come né alterare ciò assembly.GetTyes resi, o una, attributo aficionado che manterrà questi tipi di essere elencati?

+0

Non è possibile nascondere materiale dal riflesso, non è un meccanismo di sicurezza. –

+0

@BenRobinson: non è possibile nascondere materiale dal riflesso, perché è un meccanismo di sicurezza. I metadati di tipo vengono utilizzati durante le sessioni di stack e il test delle autorizzazioni. –

+0

Scusa per averlo riportato in primo piano, volevo dire che i livelli di protezione come protetti e interni non sono meccanismi di sicurezza. –

risposta

6

Questo è un bel trucco ed è molto fragile, ma potrebbe funzionare.

creare 2 gruppi - uno per il plug-in e la seconda per gli altri tipi. Il secondo sarebbe inserito in un'altra directory e caricato dinamicamente nel primo quando necessario. (Ad esempio, tramite Assembly.LoadFrom.)

Il primo assembly verrà quindi inserito nella directory plug-in e pubblicherà solo i suoi tipi. Questo è molto delicato perché è probabile che sia necessario codificare in modo sicuro un percorso per il secondo assembly e si corre il rischio che il file venga eliminato o spostato.

EDIT commento
@SLaks' toglie la fragilità di questa soluzione. Se si incorpora il secondo assembly come risorsa e lo si carica in fase di esecuzione, l'app che chiama Assembly.GetTypes non vedrà i tipi che si desidera nascondere.

+3

È possibile caricare il secondo assieme da una risorsa incorporata. – SLaks

+0

Ahh ... non ci ha pensato. Buona idea! –

+0

Ottima idea! Fortunatamente la directory non è un problema perché l'applicazione espone le directory alle quali posso accedere, ma l'idea della risorsa è geniale. –

2

Questo non è possibile.
Siamo spiacenti.

Il codice che chiama Assembly.GetTypes() in genere deve filtrare solo per i tipi public.

0

Benvenuti al codice gestito. Informazioni complete sul tipo sono necessarie al verificatore del tipo di .NET. Solo il codice nativo può essere nascosto dai metadati .NET e quindi si rinuncia alla portabilità e alle autorizzazioni supportate da MSIL puro.