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

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

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

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

 #if (SUBPROJECT) namespace SubProject #else namespace CompleteProject #endif { public class SomeClass() { #if (!SUBPROJECT) // This might call a method contained in an assembly that potentially // won't be available to the sub-project, or maybe a method that hooks // into a C library via P/Invoke... string result = CallSomeCleverMethod(); #else // This might call a method that performs a simplified version of the // above, but does so without the above's assembly or P/Invoke // dependencies... string result = CallSomeSimpleMethod(); #endif } } 

请记住,我不打算在这里进行构建 – 这纯粹只是发布一个较大项目的源代码的子集。

任何想法/帮助表示赞赏。

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

这是一个例子:

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

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

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

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

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

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

如果我必须这样做,它是一个小子集,我会编译然后使用Reflector反编译回C#并导出文件。 如果你有很多文件,有一个名为FileGenerator for Reflector的Reflector Add-In 。

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

可能不容易,更习惯性的C#,创建接口,并具有这些接口的不同实现? 你可以将一个包装成一个库并重新分配?

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

 >>python undefine apply -d SUBPROJECT your_project_path 

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