2009-04-27 5 views
9

Je compile des classes lors de l'exécution à l'aide de la classe CodeDomProvider. Cela fonctionne bien pour les classes utilisant uniquement l'espace de noms System:CompilerParameters.ReferencedAssemblies - Ajout d'une référence à System.Web.UI.WebControls

using System; 

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

Si je tente de compiler une classe en utilisant System.Web.UI.WebControls bien, je reçois cette erreur:

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

Voici un extrait de mon code:

var cp = new CompilerParameters(); 

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

Comment faire référence à l'espace de noms System.Web.UI.WebControls?

Répondre

14

Vous référencez des assemblys, pas des espaces de noms. Vous devez utiliser MSDN pour rechercher le nom de l'assemblée qui contient les classes que vous devez utiliser: dans ce cas, il va être:

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

Ne fonctionne pas pour moi. Pensez-vous que je devrais fournir le chemin complet de l'assemblée? Si oui; comment pourrais-je le faire dynamiquement? – roosteronacid

+3

Ah, System.Web.UI.WebControls.dll n'existe pas - les classes de cet espace de noms résident dans System.Web.dll à la place. –

39

Vous pouvez boucler à travers toutes les assemblées actuellement chargées:

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

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

Pourquoi attraper essayer/attraper quand .Where (a =>! A.IsDynamic) le ferait? – epitka

+0

Ma réponse originale a fonctionné avec .net 2.0 qui était ce que j'utilisais au moment où j'ai écrit le code. Ni LINQ ni la propriété Assembly.IsDynamic existent dans .net 2.0. –

+3

Notez que AddRange n'est pas Add (corrige mais ne peut pas faire <6 char edit). – phillipwei

5

Cela s'est avéré être un peu moins de force brute dans mon cas. Je construisais un addin et il y avait 730 assemblages chargés dans le domaine actuel, donc il y avait un retard important.

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. J'ai utilisé votre proposition et a très bien fonctionné. Juste vous devez éditer la dernière ligne et écrire 'cp.ReferencedAssemblies.AddRange (assemblyLocations.ToArray())' à la place. –

Questions connexes