是否存在C#预处理工具?

时间:2009-06-12 12:36:32

标签: c# c-preprocessor

有没有人知道一个实用程序来预处理C#源文件而不编译它,就像在GCC中使用-E标志一样?我尝试使用GCC - 它成功处理#if指令,但它在任何#region指令上窒息......

理想情况下,我希望能够在.cs文件上运行该工具,以删除任何评估为false的#if块,并可选择标记是否删除/保留完整的注释,{ {1}},#region指令等。

为了将其置于上下文中,我希望能够发布一些(更大)项目的一部分源代码,同时删除仅与较大项目相关的部分。例如,有大量代码如下所示:

#pragma

请记住我不是在这里尝试构建 - 这纯粹只是发布一个较大项目的源代码的一部分。

任何想法/帮助表示感谢。

5 个答案:

答案 0 :(得分:3)

事实证明,直接使用GNU C预处理器(cpp)(而不是通过gcc)可以更好地控制输出。使用它,我能够以合适的方式处理源文件...

以下是一个例子:

cpp -C -P -DSUBPROJECT Input.cs Output.cs

我试图让Visual Studio提供的C / C ++编译器做类似的事情,但一段时间后就放弃了......

答案 1 :(得分:2)

我不知道C#的预处理器允许您导出源代码的子集而不构建它。

但是,您应该能够通过使用代码生成模板来实现相同的效果。只需将preprocesor指令更改为相应的模板等效项。

Visual Studio 2008有一个名为 T4 的内置代码生成工具。还有其他第三方选项,如CodesmithTools或免费 MyGeneration.Net

答案 2 :(得分:2)

我不相信csc或msc(单声道编译器)有任何标志可以输出预处理文件。

如果我必须这样做,并且它是一个小子集,我会编译然后使用Reflector反编译回C#并导出文件。如果您有大量文件,则会有一个名为Reflector Add-InFileGenerator for Reflector

不幸的是,这不是您的代码库的真实副本 - 它将重新格式化所有代码,您将丢失所有注释。

答案 3 :(得分:1)

创建接口并使用这些接口的不同实现可能不容易,而且更加惯用C#?您可以将一个包打包为库并重新分发吗?

答案 4 :(得分:0)

我前段时间遇到过这种情况 - 不得不清理旧项目中某些过时的C#预处理器分支,使相关分支保持不变。内置的C预处理器不能为我做,因为它的输出文件永远不会包含预处理器指令。当然,有一些C处理器工具,如 unifdef coan ,可以部分删除C /С++过时的分支。问题是他们并不完全支持С#语法 - 例如,他们在#region和#pragma上失败了。所以,我必须为我的任务写my own python tool undefine。我使用regexp来解析指令和sympy库 - 用于简化和计算逻辑表达式。要解决您的任务,请尝试以下操作:

>>python undefine apply -d SUBPROJECT your_project_path

该工具在我的大型~10米线代码库中运行良好。