2009-04-27 9 views
9

Sto compilando le classi in fase di esecuzione utilizzando la classe CodeDomProvider. Questo funziona bene per le classi solo utilizzando il System namespace:CompilerParameters.ReferencedAssemblies - Aggiungi riferimento a System.Web.UI.WebControls

using System; 

public class Test 
{ 
    public String HelloWorld() 
    { 
     return "Hello World!"; 
    } 
} 

Se provo a compilare una classe utilizzando System.Web.UI.WebControls però, ottengo questo errore:

{error CS0006: Metadata file 'System.Web.UI.WebControls' could not be found} System.CodeDom.Compiler.CompilerError

Ecco un frammento del mio codice:

var cp = new CompilerParameters(); 

cp.ReferencedAssemblies.Add("System.Web.UI.WebControls"); 

Come riferimento lo spazio dei nomi System.Web.UI.WebControls?

risposta

14

Gli assiemi di riferimento, non gli spazi dei nomi. Si dovrebbe usare MSDN per cercare il nome del gruppo che contiene le classi è necessario utilizzare: in questo caso sarà:

var cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("System.Web.dll"); 
+0

Non funziona per me. Pensi che dovrei fornire il percorso completo all'assemblea? Se si; come potrei farlo dinamicamente? – roosteronacid

+3

Ah, System.Web.UI.WebControls.dll non esiste: le classi in quello spazio dei nomi vivono invece in System.Web.dll. –

39

è possibile scorrere tutte le assemblee attualmente caricati:

var assemblies = AppDomain.CurrentDomain 
          .GetAssemblies() 
          .Where(a => !a.IsDynamic) 
          .Select(a => a.Location); 

cp.ReferencedAssemblies.AddRange(assemblies.ToArray()); 
+0

Perché prendere try/catch quando .Where (a =>! A.IsDynamic) lo farebbe? – epitka

+0

La mia risposta originale ha funzionato con .net 2.0 che è quello che stavo usando nel momento in cui ho scritto il codice. Né LINQ né la proprietà Assembly.IsDynamic esistono in .net 2.0. –

+3

Nota che è AddRange not Add (risolverà ma non può rendere <6 char edit). – phillipwei

5

Questo si è dimostrato un po 'meno bruto nel mio caso. Stavo creando un addin e c'erano 730 assembly caricati nel dominio corrente, quindi c'era un ritardo maggiore.

var assemblies = someType.Assembly.GetReferencedAssemblies().ToList(); 
    var assemblyLocations = 
assemblies.Select(a => 
    Assembly.ReflectionOnlyLoad(a.FullName).Location).ToList(); 

assemblyLocations.Add(someType.Assembly.Location); 

cp.ReferencedAssemblies.AddRange(assemblyLocations.ToArray()); 
+1

+1. Ho usato la tua proposta e ho funzionato alla grande. È sufficiente modificare l'ultima riga e scrivere 'cp.ReferencedAssemblies.AddRange (assemblyLocations.ToArray());' invece. –