CodeDom有官方替代品吗?

时间:2013-02-10 11:02:09

标签: .net code-generation codedom

我正在研究System.CodeDom namespace与语言无关(至少在某些范围内)的源代码生成,并且我发现了一些阻止使用CodeDom的信息。

我认为this early blogpost中描述的一些遗漏现在已经解决了,CodeDom does not seem to provide a way to create a switch statement仍然允许的事实 - 性能较差? - 没有弄乱生成类型的公共接口的变通方法。这同样适用于automatic C# propertiescollection initializers

但是,其他遗漏实际上无法解决,例如inability to create finalizersimpossibility to declare extension methodslacking direct support of generic reference type constraints

请注意,使用CodeSnippetTypeMember建议的解决方案或通过任何其他方式注入文字源代码片段并不令人满意,因为它们不依赖于语言 - 从而消除了使用CodeDom而非{的全部要点{1}}使用文字代码段。

最后,甚至建议in this SO question'CodeDom是失败的,表达树(或者更确切地说是“声明”树)是前进的方式' - 虽然没有任何解释如何从中实际获取任何源代码expression tree {除了classes cannot be declared with expression trees的限制。

CodeDom仍然是生成源代码的首选方法,还是当前的BCL提供了一个我想不到的名称的任何模糊替换?

2 个答案:

答案 0 :(得分:4)

我认为CodeDom仍然是今天BCL 中的最佳解决方案,但:Roslyn项目已经走得很远,已经推出了多个CTP。目标是使编译器作为服务提供,并使用简单的API启用代码生成和代码检查方案。

如果您可以为项目使用预发布位,请查看它:Roslyn CTP。这是一个相关的(虽然过时,仍然是一些很好的信息)StackOverflow问题:Microsoft Roslyn vs. CodeDom。最后,一篇关于使用Roslyn进行代码生成的文章:Code Generation in .NET with the Roslyn CTP

答案 1 :(得分:3)

没有。 CodeDom对于生成执行的代码很有用。它生成文本的能力仅仅是偶然的副产品,因为编译器需要文本。如果您真的关心文本,那么有很多理由不喜欢CodeDom,而且框架中没有任何内容可以帮助您。

其他解决方案同样专注于生成可执行代码。 Reflection.Emit生成IL,.NET中的通用语言,但没有提供简单的反编译方法,尽管任何体面的反编译器(ILSpy,Reflector等)都可以提供帮助。 Linq.Expressions是纯可执行代码,通常不能用于生成完整的程序。罗斯林非常偏向于已经拥有该文本。

可能最好的方法是弃用您使用特定语言的文本的要求。所有.NET编译器都具有相同类型的输出,它们都编译为IL。这使得将一种语言的选择限制为一种可行的方法。从你的问题来看,这是否是一个合理的限制是不明确的。它似乎是一个常见的选择,我想不出一个试图解决CodeDom限制的项目。 codeplex.com上以CodeDom为目标的项目类型试图最大限度地减少使用CodeDom的代码所需的详细程度的痛苦。