将自定义版本信息添加到C#应用程序

时间:2010-11-29 16:51:57

标签: c# visual-studio-2008 build

应用程序是C#.Net 3.5 WCF服务。

我希望在构建过程中动态地将一些构建信息添加到最终的二进制文件和程序集中,然后可以以编程方式读取它们,并在向Web服务发送GetVersionInfo请求时将其发送回WCF客户端。

.Net程序集版本控制还不够。我想在构建应用程序时包含其他包含系统状态的字符串数据。

我想我会通过添加post build事件来调用脚本来使用我想要的数据更新app.config文件。这听起来是对的吗,还是我应该考虑其他方法?

更新

我还希望这个字符串出现在最终exe的“特殊构建描述”属性中。即我想右键单击该文件,并在文件的版本选项卡中查看此信息。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我怀疑预构建事件可能比构建后更合适...您是否考虑过将buildinfo.xml文件(或类似文件)添加到程序集中作为嵌入式资源?然后,您可以使用Assembly.GetManifestResourceStream加载它。这样您就不必担心适应现有文件或类似的东西 - 只需在预构建步骤中使用新文件覆盖buildinfo.xml

答案 1 :(得分:1)

您必须决定要交换的信息与可执行文件本身的关联程度。

在构建期间更新配置文件是一个可行的模型,但它将信息放在可以被任何有访问权限的人和文本编辑器更改的位置。

在编译的程序集中构建之后更新信息肯定是可能的,但是如果你决定签署程序集,那么它很脆弱并且会崩溃。这也是很多工作,因为它不支持以这种方式重写汇编文件。

您应该考虑的另一种方法是创建自己的自定义程序集级元数据属性,并在构建过程中分配它们。您甚至可以将它们放在单独的代码文件中(或将它们附加到AssemblyInfo.cs)作为构建的一部分。

您还可以考虑创建嵌入式资源(例如,XML文件),并在运行时从程序集清单中检索它。

上述任何一种方法都要求您使用预构建自定义步骤而不是构建后步骤。

就个人而言,如果没有大量数据,我发现元数据属性是一种方便的方法。否则,我会考虑使用嵌入式资源文件。