2009-04-27 1 views
9

Я компилирую классы во время выполнения с использованием класса CodeDomProvider. Это отлично работает для классов только с использованием System имен:CompilerParameters.ReferencedAssemblies - Добавить ссылку на System.Web.UI.WebControls

using System; 

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

Если я пытаюсь скомпилировать класс с помощью System.Web.UI.WebControls хотя, я получаю эту ошибку:

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

Вот отрывок из моего кода:

var cp = new CompilerParameters(); 

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

Как ссылаться на пространство имен System.Web.UI.WebControls?

ответ

14

Вы ссылаетесь на сборки, а не на пространства имен. Вы должны использовать MSDN, чтобы найти имя узла, который содержит классы, которые нужны использовать: в данном случае это будет:

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

Не работает для меня. Как вы думаете, я должен предоставить полный путь к сборке? Если да; как я могу сделать это динамически? – roosteronacid

+3

Ah, System.Web.UI.WebControls.dll не существует - вместо этого классы в этом пространстве имен находятся в System.Web.dll. –

39

Вы можете перебрать все загруженные сборки:

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

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

Зачем ловить try/catch, когда. Где (a =>! A.IsDynamic) это сделает? – epitka

+0

Мой оригинальный ответ работал с .net 2.0, который я использовал в то время, когда я написал код. Ни LINQ, ни свойство Assembly.IsDynamic не существуют в .net 2.0. –

+3

Обратите внимание, что это AddRange not Add (исправлено, но не может сделать <6 char edit). – phillipwei

5

Это оказалось немного менее грубой силой в моем случае. Я создавал addin, и в текущем домене было загружено 730 сборок, поэтому произошло значительное отставание.

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. Я использовал ваше предложение и отлично поработал. Просто вам нужно отредактировать последнюю строку и написать 'cp.ReferencedAssemblies.AddRange (assemblyLocations.ToArray()); вместо этого. –

 Смежные вопросы

  • Нет связанных вопросов^_^