在c#中基于条件编译符号生成代码文件的最简单方法是什么?

本文关键字:文件 代码 最简单 是什么 方法 符号 编译 于条件 条件 | 更新日期: 2023-09-27 18:17:30

我正在制作一个Nuget包,需要为每个MVC版本和每个。net版本输出一个版本的代码。但是,出于明显的可维护性原因,我决定在同一源文件中使用条件编译常量。

我想做的是找到一种方法,用适当的逻辑替换编译常量包围的所有部分,这样只剩下适当的代码。例如:

    var alwaysExists = 1;
    #if !MVC2
            this.For<System.Web.Mvc.IFilterProvider>()
                .Singleton()
                .Use<FilterProvider>();
    #endif
    #if NET35
            var someVariable = 100;
    #else
            var someVariable = 200;
    #endif

在上面的代码块中,如果传入的符号是MVC4, NET40,我想用

生成一个文本文件
        var alwaysExists = 1;
        this.For<System.Web.Mvc.IFilterProvider>()
            .Singleton()
            .Use<FilterProvider>();
        var someVariable = 200;

如果传入的符号是MVC2, NET35,文本文件应该是

        var alwaysExists = 1;
        var someVariable = 100;

该方法需要支持if, else, if !等所有逻辑方法。它需要有一个。cs(文本)文件输入和一个。cs(文本)文件输出。

我已经想到了一种使用正则表达式和一些自定义代码来实现这一目标的方法,但在我走这条路之前,我希望看看是否有更简单的方法。

是否有命令行工具、库或.NET框架内建的东西可以完成这个任务?

我正在寻找一种方法来部署代码文件,而不是编译的程序集,以Nuget的目标项目。我不想将条件编译符号部署到目标项目中(尽管我可以这样做),而是从代码中排除所有条件编译逻辑,并处理逻辑以生成代码文件,这些代码文件与编译器对这些符号所做的操作相同。这是作为配置的代码,目标项目将不需要超过一个。net和MVC组合-部署符号也只会使事情变得过于复杂。我试图避免不得不手动创建和维护每个单一的MVC/代码文件。. NET版本的组合,而不是处理条件编译符号来生成相同的文件集。

我从http://mcpp.sourceforge.net/download.html下载了c++预处理器,并使用命令:

mcpp -C -P -DMVC2 -DNET35 Input.cs Output.cs

请注意,我没有像文档中建议的那样使用=。

唯一真正的限制是,如果代码中有#region语句,命令将崩溃。我可以通过省略它们来解决这个问题。它还稍微打乱了代码的格式,但仍然使其处于可编译状态。

在c#中基于条件编译符号生成代码文件的最简单方法是什么?

您可能很幸运地使用了这个答案提到的GNU C预处理器。

一种选择是将所有版本相关的代码移动到具有公共接口的单独类中。然后使用条件编译一次-创建所需类的实例。

这样,就可以写成versionAdapter.RegisterProvider()而不是

this.For<System.Web.Mvc.IFilterProvider>()
                .Singleton()
                .Use<FilterProvider>()