Невозможно скомпилировать вывод кода из-за некоторых ошибок эталонной сборки

Моя проблема выглядит так:

Есть проект под названием myframework. Он имеет несколько методов расширения, определенных в нем следующим образом:

namespace myframework
{
    public static class Helpers
    {
        public static bool ContainsAll(this string obj, string[])
        {
            return true;
        }
    }
}

У него также есть некоторые другие вещи, такие как интерфейсы и т. Д. И т. Д.

Есть второй класс, который я генерирую через классы System.CodeDom. Сгенерированный вывод выглядит примерно так:

using myframework;


public class A: IMyFrameworkInterface

{
    public void foo()
    {
        string s ="HELLO";

        if(s.ContainsAll(some_arr))
            return;
    }
        //More methods defined...

}

Параметры компилятора, которые я передаю, которые создаются до фактического вызова компиляции, ссылаются на правильные сборки.

var cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("myframework.dll");

Модули компиляции кода написаны в другом проекте. Конкретный класс, отвечающий за это, также дает нам доступ к списку объектов CompilerError, с помощью которых мы можем узнать результат компиляции.

Проблема 1: когда я попробовал это в проекте asp.net, компилятор выдал ошибку, говоря, что не может найти файл метаданных myframework.dll (несмотря на то, что он упоминается в проекте).

Проблема 2: когда я попробовал это с проектом Windows Forms. Выдавало другую ошибку. На этот раз говорится, что строка не содержит определения для ContainsAll()

Как решить эти две конкретные проблемы?


person deostroll    schedule 24.05.2013    source источник
comment
Ваша сборка находится в GAC или на местном уровне?   -  person GalacticCowboy    schedule 24.05.2013
comment
О вашей первой проблеме: а) попробуйте поместить свою dll в папку bin. б) попробуйте временно дать вашей dll разрешение Everyone, чтобы исключить проблемы с разрешениями.   -  person pkExec    schedule 24.05.2013
comment
@galacticcowboy это местный   -  person deostroll    schedule 24.05.2013
comment
@pkExec как дать разрешение?   -  person deostroll    schedule 24.05.2013
comment
Звучит как вопрос порядка компиляции. Myframework.dll компилируется отдельно или той же компиляцией?   -  person Denise Skidmore    schedule 24.05.2013
comment
@denise, что dll компилируется отдельно   -  person deostroll    schedule 25.05.2013
comment
Если вы скомпилируете оба проекта вручную, вы получите те же ошибки?   -  person Denise Skidmore    schedule 25.05.2013
comment
@DeniseSkidmore Нет, я не получаю ошибок; Я только что попытался создать класс вручную в отдельном проекте. Добавлен myframework.dll в качестве ссылки на него и скомпилирован из Visual Studio. В тот раз ошибок не выдавал.   -  person deostroll    schedule 26.05.2013
comment
Вы имеете в виду, что вы изменили тип ссылки или это первая ссылка, которую вы добавили в dll?   -  person Denise Skidmore    schedule 27.05.2013
comment
@DeniseSkidmore Сначала я добавил его в проект, т.е. Я сделал последнее.   -  person deostroll    schedule 27.05.2013
comment
Если вы компилируете их отдельно, вам понадобится ссылка на место, где находится уже скомпилированная dll.   -  person Denise Skidmore    schedule 28.05.2013
comment
@DeniseSkidmore, вы говорите, что мне нужно ввести полный путь к dll в качестве аргумента для Add()?   -  person deostroll    schedule 28.05.2013
comment
Я не знаю, нужен ли вам полный путь, но относительный путь неверен, если компилятор его не находит. Некоторые люди предложили убедиться, что dll находится в папке bin, если вы не укажете дополнительный путь.   -  person Denise Skidmore    schedule 28.05.2013
comment
@DeniseSkidmore Я использую .net framework 3.5? Может ли это быть проблемой с фреймворком...? Насколько я знаю, методы расширения не поддерживались в framework v2.0.   -  person deostroll    schedule 31.05.2013
comment
Это может быть: stackoverflow.com/questions/783155/   -  person Denise Skidmore    schedule 31.05.2013


Ответы (1)


Узнал ответ на этот вопрос, немного покопавшись. Я использовал .net framework 3.5. API-интерфейс компилятора codedom по умолчанию нацелен на версию 2.0 фреймворка. Следовательно, вам нужно вручную указать правильный фреймворк:

var cp = new CompilerParameters(
    new Dictionary<string,string>() { {"CompilerVersion", "v3.5"} });

Чтобы компиляция работала в среде asp.net, вам нужно указать ссылки на правильное место. Следовательно, вам нужно будет сделать что-то вроде следующего:

cp.ReferencedAssemblies.Add(
    HttpContext.Current.Server.MapPath(
        "bin\\myframework.dll"));

Мои ссылки:

  1. http://blogs.msdn.com/b/lukeh/archive/2007/07/11/c-3-0-and-codedom.aspx
  2. Компилятор CodeDom .Net 3.5 генерирует нечетные ошибки
  3. И комментарии в сообщении вопроса. :)
person deostroll    schedule 31.05.2013