2

我一直在使用 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 的东西只是在磁盘上输出文件而不更新项目文件。

这是一个视觉效果:

替代文字

4

2 回答 2

3

是的,它可以。方法如下:http ://www.olegsych.com/2009/09/t4-and-codedom-better-together/

于 2010-07-28T13:53:33.300 回答
1

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

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

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

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

使用它,您开始了解最初创建 T4 的原因。

你必须问自己的问题是,“CodeDom 是否给了我足够的东西,以至于 T4 无法弥补它的所有缺点?”

于 2010-07-28T12:08:10.773 回答