CompilerParameters.ReferencedAssemblies - добавить ссылку на System.Web.UI.WebControls - PullRequest
9 голосов
/ 27 апреля 2009

Я компилирую классы во время выполнения, используя класс CodeDomProvider. Это хорошо работает только для классов, использующих пространство имен System:

using System;

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

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

{ошибка CS0006: файл метаданных 'System.Web.UI.WebControls' не найден} System.CodeDom.Compiler.CompilerError

Вот фрагмент моего кода:

var cp = new CompilerParameters();

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

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

Ответы [ 3 ]

40 голосов
/ 20 июня 2009

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

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

cp.ReferencedAssemblies.AddRange(assemblies.ToArray());
15 голосов
/ 27 апреля 2009

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

var cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.Web.dll");
6 голосов
/ 30 августа 2011

Это оказалось чуть менее грубой силой в моем случае. Я собирал надстройку, и в текущем домене было загружено 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());
...