【问题标题】:C# Compiler: Preprocess OnlyC# 编译器:仅预处理
【发布时间】:2011-04-13 07:00:05
【问题描述】:

我计划将SubSpec(xUnit 的一个小型 BDD 扩展,适合

SubSpec 具有 Silverlight 和 .NET 风格,最好通过 CSC 预处理器从单个主文件构建 SubSpec 的发布版本。 “发布版本”是指创建单个 cs 文件(不会有二进制版本)。版本控制将由 NuGet 处理。

我了解 C# 编译器没有单独的预处理器(而是集成到管道中)。我可以使用其他编译器/工具来代替 CSC 吗?

【问题讨论】:

    标签: c# c-preprocessor


    【解决方案1】:

    您总是可以通过 C++ 预处理器通过cl /E /P 运行它,并且您已经保证在(几乎)每个 VS 安装中都安装了它。不过,这是一个非常老派的把戏:)

    // SubSpec.cs
    // Bla bla license stuff
    
    #include "File1.cs"  // This gets read by the C++ preprocessor
    #include "File2.cs"  // and expanded out
    #include "File3.cs"
    

    【讨论】:

    • 听起来是个好主意,我会试试的。我不想做包含(虽然它打开了一些选项......),只想创建一个没有 SILVERLIGHT 条件的单个 cs 文件(减少膨胀,让我接近神奇的 500 行)。
    • +1 不错的 hack,但很多人试图保存几百兆,所以不是一个很好的假设(我知道你知道)
    【解决方案2】:

    您的tools/install.ps1 可以在 C# 文件被“安装”时做它想做的事情,因此它可以在包含期间对其进行处理 - 这可以通过在多行中使用嵌入的 $(x)$(expression) 项目有条件扩展的字符串(可能通过将一组 functions 扩展为 C# 代码作为 [string]s 形成表达式的组件),即模板,或者您可以通过一些 -replaces 管道 Get-Content . (您可能也会看到人们为此使用 T4 的示例,但如果 NuGet 是送货卡车,那么不使用它会很遗憾。如果您喜欢冒险,您可以做一个真正的解析器(或者只是一个穷人的)也在里面。

    另一种方法可能是使用partial 类,并让install.ps1 位于主文件旁边的右侧定制器文件中。

    否则你只是没有足够努力地尝试使用optimise out your #ifdef SILVERLIGHTstricks like this to get back on your horse

    【讨论】:

      【解决方案3】:

      为什么不直接将 .cs 文件添加到需要的项目中?

      如果您想从公共位置引用文件,则可以手动编辑 .csproj 文件以使用绝对(或相对)路径,而不是使用项目目录中的路径。

      【讨论】:

      • 抱歉,我可能不够清楚。 “发布版本”是指创建单个 cs 文件(不会有二进制版本)。版本控制将由 NuGet 处理。
      猜你喜欢
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多