我可以从csharp中的编译时env变量中创建一个常量吗?

我们使用Hudson来构建我们的项目,Hudson在编译时方便地定义了像“%BUILD_NUMBER%”这样的环境变量。

我想在代码中使用该变量,因此我们可以在运行时记录这是什么构建。 但是我不能做System.Environment.GetEnvironmentVariable,因为那是访问运行时环境,我想要的是这样的:

#define BUILD_NUM = %BUILD_NUMBER% 

要么

 const string BUILD_NUM = %BUILD_NUMBER% 

除了我不知道语法。 有人可以指出我正确的方向吗? 谢谢!

好的,这就是我做的事情。 它不是很优雅,但它的工作原理。 我创建了一个预构建步骤,如下所示:

 echo namespace Some.Namespace > "$(ProjectDir)\CiInfo.cs" echo { >> "$(ProjectDir)\CiInfo.cs" echo ///^Info about the continuous integration server build that produced this binary.^ >> "$(ProjectDir)\CiInfo.cs" echo public static class CiInfo >> "$(ProjectDir)\CiInfo.cs" echo { >> "$(ProjectDir)\CiInfo.cs" echo ///^The current build number, such as "153"^ >> "$(ProjectDir)\CiInfo.cs" echo public const string BuildNumber = ("%BUILD_NUMBER%" == "" ? @"Unknown" : "%BUILD_NUMBER%"); >> "$(ProjectDir)\CiInfo.cs" echo ///^String of the build number and build date/time, and other useful info.^ >> "$(ProjectDir)\CiInfo.cs" echo public const string BuildTag = ("%BUILD_TAG%" == "" ? @"nohudson" : "%BUILD_TAG%") + " built: %DATE%-%TIME%"; >> "$(ProjectDir)\CiInfo.cs" echo } >> "$(ProjectDir)\CiInfo.cs" echo } >> "$(ProjectDir)\CiInfo.cs" 

然后我将“CiInfo.cs”添加到项目中,但是从版本控制中忽略了它。 这样我就不必编辑它或提交它,并且项目总是有一个常量可用,即最新的构建号和时间。

一种方法是在编译之前添加一个构建步骤,在%BUILD_NUMBER%的相应源文件中执行正则表达式替换。

define不允许你像在C / C ++中那样在C#中定义内容。

从这个页面 :

#define指令不能用于声明常量值,这通常在C和C ++中完成。 C#中的常量最好定义为类或结构的静态成员。 如果你有几个这样的常量,可以考虑创建一个单独的“常量”类来保存它们。

如果您希望在AssemblyInfo类中反映构建号,则大多数构建工具都支持在构建时生成该类。 MSBuild有一项任务 。 和NAnt一样 。 不确定哈德森是怎么做到的。

一种可能性是使用T4生成配置类,并实例化所有常量。 T4很好地集成到MSVS中,无需您自己的自定义构建步骤。