2009-04-27 14 views
9

Estoy compilando clases en tiempo de ejecución usando la clase CodeDomProvider. Esto funciona bien para las clases solamente utilizando el System espacio de nombres:CompilerParameters.ReferencedAssemblies - Agregar referencia a System.Web.UI.WebControls

using System; 

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

Si intento compilar una clase usando System.Web.UI.WebControls sin embargo, me sale este error:

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

un fragmento de mi código aquí:

var cp = new CompilerParameters(); 

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

¿Cómo hago referencia al espacio de nombres System.Web.UI.WebControls?

Respuesta

14

Hace referencia a ensamblados, no a espacios de nombres. Debe utilizar MSDN para buscar el nombre del ensamblado que contiene las clases que necesita para su uso: en este caso va a ser:

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

No funciona para mí. ¿Crees que debería proporcionar el camino completo al conjunto? En caso afirmativo; ¿cómo podría hacer eso dinámicamente? – roosteronacid

+3

Ah, System.Web.UI.WebControls.dll no existe; las clases en ese espacio de nombres viven en System.Web.dll. –

39

Puede recorrer todas las asambleas actualmente cargados:

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

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

¿Por qué capturar try/catch cuando .Where (a =>! A.IsDynamic) lo haría? – epitka

+0

Mi respuesta original funcionó con .net 2.0 que es lo que estaba usando en el momento en que escribí el código. Ni LINQ ni la propiedad Assembly.IsDynamic existen en .net 2.0. –

+3

Tenga en cuenta que AddRange no Add (lo arreglaría pero no puede hacer <6 char edit). – phillipwei

5

Esto resultó ser un poco menos de fuerza bruta en mi caso. Estaba construyendo un complemento y había 730 ensamblajes cargados en el dominio actual, por lo que hubo un retraso importante.

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. Usé tu propuesta y funcionó muy bien. Solo necesita editar la última línea y escribir 'cp.ReferencedAssemblies.AddRange (assemblyLocations.ToArray());' en su lugar. –

Cuestiones relacionadas