在编译时使用环境变量的值定义一个常量

7
在我的csharp代码中,我需要定义一个常量,其值在编译时从环境变量扩展设置。例如,让我们谈论任意字符串,比如"Hello World"。
对于C++,似乎有各种方法。例如,参见以下答案:https://dev59.com/U37aa4cB1Zd3GeqPoVD_#22828929 令人惊讶的是,我无法找到类似的csharp解决方案。 特别是,似乎没有办法相应地调整“*.csproj”文件?
PS: 如Hans Passant下面的答案所述:有一些逻辑用于“DefineConstants”,但它们只给出一些布尔标志,因此您可以在源代码中使用条件语句,例如“#if TESTFOO”。你将不能使用环境变量的实际
例如,以下答案描述了一种可能的“解决方法”(动态生成其他源文件):https://dev59.com/KG855IYBdhLWcg3wQx5L#4453285 但我仍在寻找更“直接”的官方解决方案。

2个回答

13

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 也可以很好地工作 :) 项目 + 属性,生成选项卡,条件编译符号 = $(用户名)。不错。

是的,你应该提到那个。你需要在另一个角落里寻找,编写一个小的C#控制台应用程序来生成你项目中的一小部分.cs文件,并在预构建事件中运行它。这将会很脆弱。 - Hans Passant
需要注意的是:一旦将此代码放入csproj文件中或从IDE输入,条件编译符号字段将在重新加载时显示环境变量的实际值。它似乎将其保留为csproj中的$()表示法,但对于不理解值来自何处并尝试修改它的人来说可能会造成困惑... - Steve In CO

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接