2011-09-30 9 views
5

Ho il CompileAssemblyFromSource che funziona per il codice che fa riferimento solo agli assembly che il mio programma (che lo compila) utilizza. Funziona magnificamente.C# CompileAssemblyFromSource, aggiungere assembly di riferimento di cui ha bisogno?

Tuttavia, se ho bisogno di compilare il codice che ha un "using blah;" dichiarazione, non sarà in grado di trovare bla e dire che manca una risorsa.

Quindi se è "System.Windows.Forms" e io dico "compilerparams.ReferencedAssemblies.Add (" System.Windows.Forms.dll ")", funziona.

Così posso analizzare il file di codice e ottenere tutti i parametri "using", ma come faccio a sapere che quelli dovrebbero essere aggiunti "* .dll", o sono namespace altrove o whatnot? C'è un modo per .NET di prendere "System.Windows.Forms" e sputare fuori "System.Windows.Forms.dll" perché è ciò di cui ha bisogno e così via?

+0

non c'è modo per trovare ciò di montaggio contiene le classi, perché gli spazi dei nomi possono deporre le uova acr oss gli asseblies e qualcuno potrebbe creare la DLL con esattamente lo stesso nome di classe e lo stesso spazio dei nomi che usi, quindi il tuo codice non può essere compilato. Per risolvere un problema, devi fornire binari, ad esempio, assembly satellite, da includere come riferimento insieme al tuo codice sorgente nello stesso modo, Visual Studio contiene i riferimenti (inclusi gli hash) –

+0

Cosa dire di 'Assembly.GetAssembly (typeof (MyType)) '?? Dovresti sapere quali tipi erano effettivamente in uso, non solo le istruzioni using, perché un singolo spazio dei nomi può provenire da più assembly per @ArturMustafin – mellamokb

+0

@mellamokb: Se il codice è simile al seguente: 'Assembly.GetAssembly (typeof (MyType)), significa che il tipo "MyType" è noto al momento della compilazione (richiesto per l'uso dell'istruzione 'typeof'), ovvero il codice stesso o la fonte che si sta compilando, il che non è il caso. Nel tuo caso, devi fornire il metodo di risoluzione per il gestore di eventi AppDomain.AssemblyResolve per individuare e scaricare gli assembly. Ma, comunque, come si dice, non è possibile fare affidamento solo su un codice sorgente per risolvere il problema –

risposta

1
  1. Leggere l'articolo How the Runtime Locates Assemblies
  2. Prima di compilare il carico codice tutti i gruppi trovati nelle posizioni di cui al punto 1
  3. caricare tutti i tipi in tutti i gruppi e mantenere un dizionario di namespace, tipo coppia
  4. quando viene rilevato un utilizzo nella sorgente di provare ad aggiungere di riferimento di assemblee dal dizionario in 3
Problemi correlati