2015-04-23 22 views
6

Ho qualche codiceCome caricare DLL durante il debug in VS2013

var aa = a(); 
b(aa); 

Durante il debug, ho impostato un punto di interruzione sulla chiamata b(). Quindi andando alla finestra immediata , mi piacerebbe essere in grado di eseguire codice da una DLL presente nel mio progetto ma non ancora caricato. Dire che voglio un nuovo Boo e chiamare Foo(). Il codice è nel namespace Baz in dll Spongle.dll.

Quando digito

>> new Baz.Boo().Foo(aa) 

ottengo l'errore: Il tipo o dello spazio dei nomi il nome 'Baz' non è valido in questo ambito.

Se cambio il mio codice in modo che il mio Boo sia già caricato, funziona correttamente.

new Boo(); // dummy to ensure loading 
var aa = a(); 
b(aa); 

E 'possibile caricare la DLL dalla finestra immediata durante il debug in modo che posso chiamare il mio codice anche se è stato caricato (ancora) ?. Potrei usare lo new Boo() come inizializzatore statico della mia classe principale dell'applicazione, ma poi ho problemi durante i test unitari in quanto non implicherebbe necessariamente la classe con quell'inizializzatore statico.

+0

Lo spazio dei nomi è 'Baz' ed è già incluso nella mia domanda, sfortunatamente. –

+0

Ci deve essere qualcosa che hai trascurato, poiché non ho mai avuto il problema che stai descrivendo. Puoi mostrare la definizione completa della tua classe Boo? –

+0

@Nathan A: Prendi qualsiasi DLL che usi nella tua applicazione, esegui il debug di un unit test non usando quella dll, imposta un breakpoint e prova l'istanziazione da quella dll nella finestra immediata –

risposta

2

Sebbene pesanti, è possibile utilizzare la riflessione per caricare il gruppo per quel test.

La seguente non funzionerebbe:

var obj = new Newtonsoft.Json.Linq.JObject(); 

poiché il gruppo non è ancora presente. Tuttavia, se lo carico esplicitamente prima tramite reflection e un percorso assoluto verso il mio bin, posso istanziare l'oggetto perfettamente.

var assembly = System.Reflection.Assembly.LoadFile("C:\\AbsolutePath\\bin\\Debug\\Newtonsoft.Json.dll"); 
var obj = new Newtonsoft.Json.Linq.JObject(); 

La ragione di questa necessità dalla finestra immediata è che come applicazione (o unit test boostrapped applicazione in questo caso) i carichi, cerca riferimenti in tutto il codice e carica gli assembly necessari per soddisfare le vostre esigenze. Nel tuo caso, non hai un riferimento esplicito all'assembly nel tuo codice, quindi non è caricato. La finestra immediata non ha contesto e, come tale, devi caricarla esplicitamente.

Per fare riferimento in modo programmatico ai potenziali assiemi da caricare, è possibile utilizzare la directory bin dell'assieme caricato. Questo ti permette di tirare il percorso assoluto in fase di esecuzione.

var filePath = new Uri(this.GetType().Assembly.CodeBase).LocalPath; 
var bin = System.IO.Path.GetDirectoryName(filePath); 
var assembly = System.Reflection.Assembly.LoadFile(bin + "\\Newtonsoft.Json.dll"); 
+0

Esiste una variabile in VS che punta al percorso di build o nuget in cui risiedono i pacchetti di nuget? tale che si possa dire 'System.Reflection.Assembly.LoadFile ($ nugetpath + "Newtonsoft.Json.dll") '? –

+1

@ CarloV.Dango Aggiornato la mia risposta. Non si vorrebbe necessariamente fare riferimento all'origine del pacchetto nuget (in particolare considerando che la struttura attuale dovrebbe cambiare in vNext). Detto questo, è possibile estrarre gli assemblaggi dalla directory bin del punto di ingresso dell'applicazione. –