使用在编译期间扩展的enivornment变量定义常量

pau*_*ten 3 c# visual-studio

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

在这个例子中,让我们谈谈任何字符串,例如"Hello World".

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

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

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

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

但我仍然在寻找更"直接"的官方解决方案.

Han*_*ant 7

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

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

   <DefineConstants>DEBUG;TRACE;$(USERNAME)</DefineConstants>
Run Code Online (Sandbox Code Playgroud)

使用如下:

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

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


DrK*_*och 0

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