是否存在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处理器工具,如unifdef或coan ,可以部分删除C /С++过时的分支。 问题是他们并不完全支持С#语法 – 例如,他们在#region和#pragma上失败了。 所以,我必须为我的任务编写自己的python工具undefine 。 我使用regexp来解析指令和sympy库 – 用于简化和计算逻辑表达式。 要解决您的任务,请尝试以下操作:
>>python undefine apply -d SUBPROJECT your_project_path
该工具在我的大型~10米线代码库中运行良好。