使用在编译期间展开的环境变量定义常量

时间:2015-03-25 11:28:05

标签: c# visual-studio

在我的csharp代码中,我需要定义一个常量,其值在编译时期间从环境变量扩展设置。

在这个例子中,我们来谈谈任意字符串,例如“Hello World”。

对于c ++,似乎有各种方法。请参阅以下答案,例如:https://stackoverflow.com/a/22828929

令人惊讶的是我无法为csharp找到类似的解决方案 特别是,似乎无法相应地调整“* .csproj”文件?

PS:
“DefineConstants”有一些逻辑,但它们只给你一些布尔标志,所以你可以在源代码中使用条件语句,如“#if TESTFOO”。您将无法使用环境变量的实际

以下答案中描述了一种可能的“解决方法”(以动态生成其他源文件),例如:https://stackoverflow.com/a/4453285

但我仍在寻找一种更直接的官方解决方案。

2 个答案:

答案 0 :(得分:7)

C#构建系统不支持强烈使用环境变量。在C ++构建中有些不可避免,它的构建模型可以追溯到20世纪70年代,但微软为C#传递了它。当您在完成项目后尝试重建应用程序一年或更长时间时,它确实有一个很棒的诀窍来导致构建中断。或者当您尝试在另一台计算机上构建并且未正确设置其环境时快速。将所有构建配置集中在一个地方是最好的解决方案。

但MSBuild支持它们,您可以在.csproj文件中引用$(NAME)的环境变量。例如,您可以使用它设置条件编译符号,即在#if表达式中测试的类型。这需要手动编辑.csproj文件,使用像记事本这样的文本编辑器。找到<DefineConstants>元素,通常有两个。一个用于Debug构建,另一个用于Release构建。一个愚蠢的例子:

   <DefineConstants>DEBUG;TRACE;$(USERNAME)</DefineConstants>

并使用如下:

    static void Main(string[] args) {
#if hpassant
        Console.WriteLine("It's mine!");
#endif
        Console.ReadLine();
    }

哎呀,测试一下它会发现它在IDE中工作正常:)项目+属性,构建选项卡,条件编译符号= $(USERNAME)。好的。

答案 1 :(得分:0)

C#不支持预处理器宏。在编译器看到它之前生成/修改源代码的唯一方法(这就是你想要做的)是模板/宏扩展引擎(如mustachet4