Я использую CodeDom для генерации кода. Это прекрасно работает, но я не нашел способа включить сгенерированные файлы исходного кода в проект. Я начал использовать T4 и T4Toolbox для создания кода, поскольку он поддерживает интеграцию с файлами проекта.
Кто-нибудь знает, поддерживает ли 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();
}
Это работает нормально, но он просто выводит файл куда-то на жесткий диск (возможно, в папку bin).
Вот второй пример кода, который я использую с 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 просто выводит файл на диск и не обновляет файл проекта.
Вот визуальный ряд: