代码之家  ›  专栏  ›  技术社区  ›  ng5000

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

  •  0
  • ng5000  · 技术社区  · 14 年前

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

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

    .Net程序集版本控制还不够。我想包括额外的字符串数据,其中包含应用程序生成时系统的状态。

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

    更新

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

    提前谢谢。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    14 年前

    我怀疑预生成事件可能比后生成事件更合适。。。你考虑过加一个 buildinfo.xml 要作为嵌入资源构建到程序集中的文件(或类似文件)?你可以装上 Assembly.GetManifestResourceStream . 这样你就不必担心与现有文件或类似的东西相适应了,只是改写。 buildinfo.xml文件 在预构建步骤中添加新文件。

        2
  •  1
  •   LBushkin    14 年前

    您必须决定将要交换的信息绑定到可执行文件本身有多重要。

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

    在编译的程序集中生成后更新信息当然是可能的,但如果您决定对程序集签名,它会很脆弱并崩溃。这也需要做很多工作,因为没有内置的It支持以这种方式重新编写程序集文件。

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

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

    以上两种方法都要求您使用预构建自定义步骤,而不是后构建步骤。

    我个人认为,如果没有很多数据,元数据属性是一种方便的方法。否则,我会考虑使用嵌入式资源文件。