1) Risposta breve: è necessario aggiungereRiferimento su tutti gli assembly di cui si intende utilizzare i tipi nello script.
Dettagli: Il compilatore C# non indovina dove sono i file dipendenti. Un file assembly non specifica percorsi completi per tutte le sue dipendenze. Contiene solo i loro nomi e in genere non è sufficiente per consentire al compilatore di individuare il file di assembly.
Ulteriori dettagli: Esistono due tipi di dipendenze. Li chiamerò dipendenze del tempo di compilazione (a) e delle dipendenze di runtime (b).
(a) Supponiamo di avere "public class A: B {}" nell'assembly A.dll, "public class B {}" nell'assembly B.dll e lo script utilizza A, ad esempio si crea un nuovo esempio: "nuova A()". Il compilatore richiede in questo caso l'aggiunta di riferimenti ad A.dll e B.dll, poiché A deriva da B e il compilatore deve analizzare la gerarchia di ereditarietà di ciascun tipo che si utilizza. Quindi B.dll è una dipendenza in fase di compilazione del tuo script - il compilatore ne ha bisogno per analizzare correttamente lo script.
(b) Considerare un altro esempio: "public class A {oggetto pubblico M() {return new B();}}" in A.dll e lo stesso B.dll come sopra. Ora quando si compila "nuovo A(). M()" il compilatore non ha bisogno di sapere di B, poiché il riferimento a B si verifica solo nel corpo del metodo M e il compilatore non analizza i corpi dei metodi importati. In questo caso è sufficiente aggiungere un riferimento a A.dll per compilare lo script. Quando lo script viene eseguito chiama il metodo M. A quel punto il CLR carica l'assembly B. Questo diventa un po 'complesso, quindi salterò i dettagli ma negli scenari comuni saremo in grado di localizzare l'assembly per te, quindi non lo farai t necessario aggiungere esplicitamente il riferimento
2) Si consiglia di utilizzare l'overload di AddReference che richiede l'oggetto Assembly. Qualcosa come: engine.AddReference (typeof (SomeTypeInAssemblyFoo) .Assembly) per caricare l'assembly Foo che contiene type SomeTypeInAssemblyFoo.
3) Non semplice. È possibile enumerare tutti i riferimenti utilizzando le API Reflection o Roslyn e caricare ciascuno di essi.
Sentiti libero di fare ulteriori domande se la spiegazione non è chiara o se desideri conoscere maggiori dettagli.
fonte
2012-11-19 19:30:05
Risposta eccellente, +1! – GETah