2010-07-28 143 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(); 
} 

这工作正常,但它只是输出文件到硬盘中的某个地方(可能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的东西只是在磁盘上输出文件,并没有更新项目文件。

这里是一个可视化:

alt text

+0

嗯,不知道你在做什么。你正在将CodeDom与t4混合?我使用T4将模板添加到解决方案中,然后使用EnvDTE将文件添加到解决方案中。也许你需要澄清你在做什么? – Will 2010-07-28 12:11:02

+0

@我刚刚在CodeDom和T4的不同方式上面添加了一些示例。这听起来像我可能需要看看EnvDTE? – 2010-07-28 12:32:33

回答

1

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

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

虽然T4可以很容易地将文件添加到解决方案,您可以用CodeDom中做到这一点。我不相信它支持直接与解决方案进行交互,但是您可以使用EnvDTE或Visual Studio的自动化模型来管理它。

问题在于自动化模型不容易处理。 EnvDTE是COM类的一个包装,它总是有趣的编码。另外,您在尝试获取对象时必须小心。天真的实现将从Visual Studio的第一个实例中加载对象。您必须轮询Running Object Table以查找当前实例。一旦你有了它,你必须处理通过寻找你想要找的位置,处理源代码管理,锁定文件等等。

使用它,你开始学习为什么T4创建在第一个地方。

你要问自己的问题是,“是否CodeDom中给我足够T4不来弥补其所有的缺点?”

+0

很好的反馈,谢谢你的回答。我有点怀疑答案是“不”,但很好让其他人确认。 就像你提到的那样,T4的设计是为了让生活更轻松,我完全同意--t4工具箱更进一步。我可能会继续使用T4代码生成。尽管听起来很有趣,但我并没有足够的动力来研究EnvDTE,COM接口,运行对象表等。:-) – 2010-07-28 13:42:59

相关问题