2009-04-27 10 views
9

CodeDomProvider sınıfını kullanarak çalışma zamanında sınıfları derliyorum. Bu yalnızca System ad kullanan sınıflar için çalışıyor: İşteCompilerParameters.ReferencedAssemblies - Add System.Web.UI.WebControls

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

benim kod snippet'idir var:

olsa System.Web.UI.WebControls kullanarak sınıfı derlemeye çalışırsanız

using System; 

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

, bu hatayı alıyorum

var cp = new CompilerParameters(); 

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

System.Web.UI.WebControls ad alanına nasıl başvurabilirim?

cevap

14

Ad alanlarına değil, başvurulara başvuruyorsunuz. durumda olacak: Kullanmak için gereken sınıfları içeren derleme adı bulmak için MSDN kullanmalıdır

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

Benim için çalışmıyor. Sence meclise tam yol vermeliyim? Eğer evetse; bunu dinamik olarak nasıl yapabilirim? – roosteronacid

+3

Ah, System.Web.UI.WebControls.dll mevcut değil - bu namespace sınıfları yerine System.Web.dll içinde yaşıyor. –

39

Sen geleni anda yüklü meclisleri aracılığıyla döngü:

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

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

Neden .Where (a =>! A.IsDynamic) bunu ne zaman yapar? – epitka

+0

Orijinal cevabım, kodu yazdığım sırada kullandığım .net 2.0 ile çalıştı. Ne LINQ ne de Assembly.IsDynamic özelliği .net 2.0'da var. –

+3

AddRange eklenmediğini unutmayın (düzeltmek ancak <6 karakterlik düzenleme yapamaz). – phillipwei

5

Bu, benim durumumda biraz daha az kaba kuvvet olduğunu kanıtladı. Bir eklenti inşa ediyordum ve şu anki alanda yüklü 730 tane meclis vardı, bu yüzden büyük bir gecikme söz konusuydu.

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. Teklifini kullandım ve çok çalıştım. Sadece son satırı düzenlemeniz ve 'cp.ReferencedAssemblies.AddRange (assemblyLocations.ToArray());' yerine yazmanız gerekir. –