CodeDom可以将源代码文件添加到项目中吗?

时间:2010-07-28 11:43:34

标签: code-generation t4 codedom

我一直在使用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代码会将文件输出到我项目的“Domain”文件夹中。但是CodeGen的东西只是在磁盘上输出文件,而不是更新项目文件。

这是一个视觉效果:

alt text

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

简短的回答是否定的,但我可能是错的(曾试图证明是消极的?)

你的问题有点令人困惑,因为CodeDom与T4不完全一致。 T4模板是以相同方式生成代码文件的便捷方式,例如,asp.net生成HTML文件,混合文本和执行的代码以生成文件,然后由其他东西(例如编译器或浏览器)解释)。 CodeDom通常用于在运行时生成程序集而不是文件,尽管你可以这样做(正如你所发现的那样)。

虽然T4可以轻松地将文件添加到解决方案中,但您也可以使用CodeDom执行此操作。我不相信它支持直接与解决方案交互,但您可以使用EnvDTE或Visual Studio的自动化模型来管理它。

问题在于自动化模型不易使用。 EnvDTE是COM类的包装器,编写代码总是很有趣。此外,在尝试获取对象时必须小心。天真的实现将从第一个Visual Studio实例加载对象。您必须轮询Running Object Table以查找当前实例。一旦你拥有它,你必须处理在dte中搜索你正在寻找的位置,处理源代码控制,锁定文件等等。

使用它,您开始了解为什么首先创建T4。

你必须问自己的问题是,“CodeDom是否足以让T4不能弥补其所有缺点?”