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

C# 使用编译期间展开的环境变量值定义常量,c#,visual-studio,C#,Visual Studio,在我的csharp代码中,我需要定义一个常量,其中的值是在编译时通过环境变量扩展设置的 在本例中,让我们讨论任意字符串,例如“Hello World” 对于C++,似乎有各种方法。例如,请参见以下答案: 令人惊讶的是,我无法为csharp找到类似的解决方案。 特别是,似乎没有办法相应地调整“*.csproj”文件 附言: 正如Hans Passant在下面的回答中提到的:“DefineConstants”有一些逻辑,但它们只提供某种布尔标志,因此您可以将其用于源代码中的条件语句,如“#if TE

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

在本例中,让我们讨论任意字符串,例如“Hello World”

对于C++,似乎有各种方法。例如,请参见以下答案:

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

附言:
正如Hans Passant在下面的回答中提到的:“DefineConstants”有一些逻辑,但它们只提供某种布尔标志,因此您可以将其用于源代码中的条件语句,如“#if TESTFOO”。您将无法使用环境变量的实际值

下面的回答中描述了一种可能的“变通方法”(动态生成其他源文件),例如:

但我仍然在寻找一个更“直接”的官方解决方案。

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

编译系统不支持强烈使用环境变量。C++构建中有点不可避免,它的构建模型可以追溯到上世纪70年代,但它被微软授予了C。当您在完成项目一年或更长时间后尝试重新构建应用程序时,它确实有一个奇妙的诀窍,可以导致构建中断。或者,当您尝试在另一台机器上构建时,如果其环境设置不正确,则会很快执行。将所有构建配置放在一个位置是一个更好的解决方案

但是MSBuild支持它们,您可以在.csproj文件中引用具有
$(名称)
的环境变量。例如,可以使用它设置条件编译符号,即在
#if
表达式中测试的类型。如果需要手动编辑.csproj文件,请使用记事本之类的文本编辑器。找到
元素,通常有两个。一个用于调试版本,另一个用于发布版本。一个愚蠢的例子:

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


面向对象,对其进行进一步测试后发现,它在IDE中也可以正常工作:)项目+属性,构建选项卡,条件编译符号=$(用户名)。很好。

是的,你应该提到这一点。你需要看看另一个角落,编写一个小型C#控制台应用程序,生成一个小的.cs文件,它是你项目的一部分,并在预构建事件中运行它。需要注意的是:一旦您将其放入csproj文件或从IDE中输入,条件编译符号字段将在重新加载时显示环境变量的实际值。在csproj中,它似乎将其保留为$()符号,但对于不了解值的来源并试图修改它的人来说,这可能会造成混淆…相关或重复:。
    static void Main(string[] args) {
#if hpassant
        Console.WriteLine("It's mine!");
#endif
        Console.ReadLine();
    }