Ignora le dipendenze mancanti durante ReflectionOnlyLoad

voti
17

Sto lavorando su una finestra del browser semplice classe che consente agli utenti di aprire un assieme e scegliere un metodo statico dall'interno. Tuttavia, ci sono alcune situazioni in cui le dipendenze del montaggio sono mancanti.

Dal momento che ho solo bisogno il nome del metodo e non il suo pieno prototipo, esiste un modo per superare il FileNotFoundException che viene generato quando si chiama Assembly.ReflectionOnlyLoadFrom ? Attualmente sto maneggiando AppDomain.ReflectionOnlyAssemblyResolve ma se torno nulla allora ho un FileLoadException con il seguente messaggio:

Impossibile risolvere la dipendenza di assembly '...' perché non è stato precaricato. Quando si usano le API ReflectionOnly, assembly dipendenti devono essere pre-caricato o caricati su richiesta attraverso l'evento ReflectionOnlyAssemblyResolve.

So che questo deve essere possibile in qualche modo, perché .NET Reflector permette di saltare dipendenze non risolte. Comunque sto iniziando a pensare che forse Riflettore analizza le assemblee manualmente invece di caricarla nel CLR e utilizzando la riflessione standard. Forse utilizza qualcosa come Cecil dal progetto Mono.

È pubblicato 27/08/2009 alle 07:52
fonte dall'utente
In altre lingue...                            


3 risposte

voti
1

Credo che Reflector fa propria assemblea parsing / carico - ho guardato alla fonte un po 'indietro (utilizzando Reflector sé: p) e ho visto un gran numero di classi di assemblaggio legati, che sembrano essere analizzato in una struttura ad albero enorme.

Si può sempre e-mail Red Gate / Rutz Loeder e chiedere loro conferma definitiva. :)

Risposto il 27/08/2009 a 08:27
fonte dall'utente

voti
3

Mi piacerebbe provare Cecil se avete intenzione di fare il lavoro non banale con assemblee. C'è anche il MS CCI . (Io non sono sicuro al 100% uno di questi lavori con pezzi mancanti, ma sono certamente buoni strumenti in questo spazio e sarei sorpreso se alzarmi)

Se si ha realmente bisogno per arrivare al metallo, non si può battere questa esercitazione ASMEX e del campione , che dovrebbe sicuramente sia il lavoro o permetterà di lavorare intorno ad esso.

Risposto il 27/08/2009 a 08:46
fonte dall'utente

voti
3

Questo ignorerà le vostre dipendenze mancanti:

        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
            Assembly assembly = Assembly.ReflectionOnlyLoad("foo");
            foreach (Type t in assembly.GetTypes())
            {
                Console.WriteLine(t.FullName);
            }
        }

        static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
        {
            return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
        }
Risposto il 15/12/2011 a 23:08
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more