1

我正在制作一个 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 语句,该命令会崩溃。我可以通过省略它们来解决这个问题。它还稍微弄乱了代码的格式,但仍将其保持在可编译状态。

4

2 回答 2

2

正如这个答案所提到 的,您可能会幸运地使用 GNU C 预处理器。

于 2013-06-08T05:14:55.597 回答
0

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

这样,您可以编写类似的东西,versionAdapter.RegisterProvider()而不是

this.For<System.Web.Mvc.IFilterProvider>()
                .Singleton()
                .Use<FilterProvider>()
于 2013-06-07T21:04:15.403 回答