2010-07-28 2 views
2

Я использую CodeDom для создания кода. Он отлично работает, но я не нашел способ включить сгенерированные файлы исходного кода в проект. Я начал использовать T4 и T4Toolbox для генерации кода, потому что он поддерживает интеграцию с файлами проекта.Может ли CodeDom добавлять файлы исходного кода в проект?

Кто-нибудь знает, поддерживает ли CodeDom эту функцию? Я бы подумал о втором взгляде на CodeDom, если он поддерживает только эту функцию.

Вот пример того, как я сделать файл исходного кода с CodeDom:

protected void CreateSourceFile(CodeCompileUnit codeCompileUnit, 
           string fileName, 
           out string fileNameWithExtension) 
{ 
    fileNameWithExtension = string.Format("{0}.{1}", 
              fileName, 
              CodeProvider.FileExtension); 

    var indentedTextWriter = 
     new IndentedTextWriter(new StreamWriter(fileNameWithExtension, 
               false), 
           TabString); 

    CodeProvider.GenerateCodeFromCompileUnit(codeCompileUnit, 
              indentedTextWriter, 
              new CodeGeneratorOptions()); 

    indentedTextWriter.Close(); 
} 

Это прекрасно работает, но он просто выводит файл на жесткий диск где-то (вероятно, бен папку).

Вот второй пример некоторого кода я использую с T4, это один задает вывод в рамках проекта шаблон преобразуется в:

public class RDFSClassGenerator : Generator 
{ 
    private readonly string rootNamespace; 
    private readonly string ontologyLocation; 

    public RDFSClassGenerator(
     string rootNamespace, 
     string ontologyLocation) 
    { 
     this.rootNamespace = rootNamespace; 
     this.ontologyLocation = ontologyLocation; 
    } 

    protected override void RunCore() 
    { 

     XElement ontology = XElement.Load(ontologyLocation); 
     var service = new RDFSGeneratorService(ontology); 

     foreach (MetaClass metaClass in service.MetaClasses) 
     { 
      var rdfsClassTemplate = new RDFSClassTemplate(rootNamespace, metaClass); 
      rdfsClassTemplate.Output.File = "Domain/" + metaClass.Name + ".cs"; 
      rdfsClassTemplate.Render(); 
     } 

    } 
} 

Так код T4 будет выходной файл в «Доменная» папка моего проекта. Но материал CodeGen просто выводит файл на диск и не обновляет файл проекта.

Вот визуальный:

alt text

+0

Хммм, Не уверен, что вы делаете. Вы смешиваете CodeDom с t4? Я использую T4 для добавления файлов в решение, создав конкретный хост шаблона, а затем с помощью EnvDTE добавьте файл в решение. Может быть, вам нужно уточнить, что вы делаете? – Will

+0

@ Я только что добавил несколько примеров из разных способов использования CodeDom и T4.Похоже, мне, возможно, придется заглянуть в EnvDTE? –

ответ

3

Да, это возможно. Вот так: http://www.olegsych.com/2009/09/t4-and-codedom-better-together/

+0

Спасибо за ссылку. Я расскажу об этом более подробно в ближайшее время. Полезно знать, как код dom, так и t4 могут использоваться вместе. –

1

Короткий ответ: нет, но я мог бы быть неправильно (либо попытаться доказать обратное?)

Ваш вопрос был немного запутанным, как CodeDOM ISN t точно соответствует T4. Шаблоны T4 - это удобный способ генерации файлов кода таким же образом, например asp.net генерирует HTML-файлы, смешивая текст и код, который выполняется для создания файла, который затем интерпретируется чем-то другим (например, компилятором или браузером). CodeDom обычно используется для создания сборок во время выполнения, а не файлов, хотя вы можете это сделать (как вы обнаружили).

Хотя T4 упрощает добавление файлов в решение, вы можете сделать это с помощью CodeDom. Я не верю, что он поддерживает взаимодействие с решением напрямую, но вы можете управлять им с помощью EnvDTE или модели автоматизации для Visual Studio.

Проблема в том, что с моделью автоматизации работать нелегко. EnvDTE - это оболочка классов COM, которая всегда забава для кода. Кроме того, вы должны быть осторожны при попытке получить объект. Наивная реализация получит объект из первого экземпляра загруженной Visual Studio. Вы должны опросить Running Object Table, чтобы найти текущий экземпляр. Если у вас есть это, вы должны иметь дело с поиском через dte для местоположения, которое вы ищете, справиться с контролем источника, заблокированными файлами и т. Д.

Работая с ним, вы начинаете узнавать, почему T4 был создан в первое место.

Вопрос, который вы должны задать себе, заключается в следующем: «Does CodeDom дает мне достаточно, чтобы T4 не восполнял все его недостатки?»

+0

Отличная обратная связь, спасибо за ваш ответ. Я вроде как подозревал, что ответ был «Нет», но хорошо, чтобы кто-то еще подтвердил это. Как вы упомянули, T4 был разработан, чтобы облегчить жизнь, я полностью согласен - панель инструментов t4 принимает ее еще больше. Я, вероятно, продолжу использовать T4 для генерации кода. Как бы забавно это ни звучало, я недостаточно мотивирован, чтобы исследовать EnvDTE, COM-интерфейсы, Running Object Tables и т. Д. :-) –

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