我一直在使用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的东西只是在磁盘上输出文件,而不是更新项目文件。
这是一个视觉效果:
答案 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不能弥补其所有缺点?”