C# 从部署的应用程序中检索上次提交ID/修订号

C# 从部署的应用程序中检索上次提交ID/修订号,c#,java,c++,git,svn,C#,Java,C++,Git,Svn,我希望有一个函数返回构建已部署应用程序/库的源的最后一次修订/提交ID < >我使用C++中的

我希望有一个函数返回构建已部署应用程序/库的源的最后一次修订/提交ID

< >我使用C++中的YoTimeX<宏,但是这种方法有明显的缺点。 有哪些工具可以自动实现这一点?


我使用Eclipse CDT作为C++(Linux,Svn),但它也对Git解决方案感兴趣,并且在爪哇和C语言编写的源代码。

< P>如果你使用MaFe文件和Svn,你可以为C或C++做这样的事情:

REVISION=$(shell svnversion)
CFLAGS=... -D__REVISION__=\"$REVISION\"
我不太熟悉CDT,但我知道它能够使用基于Makefile的构建系统。

//
 /// <summary>
 /// Gets the SVN date.
 /// </summary>
 /// <value>The SVN date. value</value>
// ReSharper disable UnusedMember.Global
public static new string SvnDate{
  // ReSharper restore UnusedMember.Global
  get {
    const string S = "$Date$";
    return S.Substring(7, 19);
  }
}
 /// <summary>
 /// Gets the SVN ID.
 /// </summary>
 /// <value>The SVN ID. value</value>
// ReSharper disable UnusedMember.Global
public static new string SvnID{
  // ReSharper restore UnusedMember.Global
  get{
    const string S = "$Id$";
    const string D = "$";
    return S.Replace(D + "Id: ", string.Empty).Replace(" " + D, string.Empty);
  }
}
 /// <summary>
 /// Gets the SVN rev.
 /// </summary>
 /// <value>The SVN rev. value</value>
// ReSharper disable UnusedMember.Global
// ReSharper disable MemberCanBePrivate.Global
public static new string SvnRev{
  // ReSharper restore MemberCanBePrivate.Global
  // ReSharper restore UnusedMember.Global
  get {
    const string S = "$Rev$";
    return S.Item(1);
  }
}
 /// <summary>
 /// Gets the SVN author.
 /// </summary>
 /// <value>The SVN author. value</value>
// ReSharper disable UnusedMember.Global
public static new string SvnAuthor{
  // ReSharper restore UnusedMember.Global
  get {
    const string S = "$Author$";
    return S.Item(1);
  }
}
///获取SVN日期。 /// ///SVN日期。价值 //ReSharper禁用UnusedMember.Global 公共静态新字符串SvnDate{ //ReSharper还原未使用的成员。全局 得到{ 常量字符串S=“$Date$”; 返回S.子串(7,19); } } /// ///获取SVN ID。 /// ///SVN ID.值 //ReSharper禁用UnusedMember.Global 公共静态新字符串SvnID{ //ReSharper还原未使用的成员。全局 得到{ 常量字符串S=“$Id$”; 常量字符串D=“$”; 返回S.Replace(D+“Id:”,string.Empty)。Replace(“+D,string.Empty”); } } /// ///获取SVN版本。 /// ///SVN版本。价值 //ReSharper禁用UnusedMember.Global //ReSharper disable MemberCanBePrivate.Global 公共静态新字符串SvnRev{ //ReSharper restore MemberCanBePrivate.Global //ReSharper还原未使用的成员。全局 得到{ 常量字符串S=“$Rev$”; 返回第(1)项; } } /// ///获取SVN作者。 /// ///SVN作者。价值 //ReSharper禁用UnusedMember.Global 公共静态新字符串svnautor{ //ReSharper还原未使用的成员。全局 得到{ 常量字符串S=“$Author$”; 返回第(1)项; } }

注意:S.Item(n)返回一个以空格分隔的零基项。替换为您自己的代码。而且,新的只在处理继承时才有必要。道具必须在svn中设置。由于我现在使用Mercurial,因此没有显示扩展的代码片段。

通过使用Visual Studio和C#您可以在预先构建的步骤中使用模板文件调用命令,该模板文件将复制到解决方案中使用的文件中

预构建步骤中的命令是:

<PreBuildEvent>SubWCRev "$(ProjectDir)\" "$(ProjectDir)VersionProvider.template.cs" "$(ProjectDir)VersionProvider.cs"</PreBuildEvent>
通过这种方式,项目将自动将此项目文件夹的当前subversion修订号烘焙到应用程序的版本信息中,可以在文件属性的详细信息页面上看到

您还可以在运行时通过代码检索此信息:

private string GetAdditionalVersionInfo()
{
    var assembly = Assembly.GetEntryAssembly();
    var attributesFound = assembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), true);

    var version = attributesFound.OfType<AssemblyInformationalVersionAttribute>().FirstOrDefault();

    return version != null ? version.InformationalVersion : String.Empty;
}
私有字符串GetAdditionalVersionInfo()
{
var assembly=assembly.GetEntryAssembly();
var attributesFound=assembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute),true);
var version=attributesFound.OfType().FirstOrDefault();
返回版本!=null?版本。信息版本:String.Empty;
}

您知道Git是否也可以做类似的事情吗?
internal static class VersionProvider
{
    /// <summary>
    /// Provides the current subversion revision number
    /// </summary>
    internal const string CurrentSVNRevision = "$WCREV$";
}
[assembly: AssemblyInformationalVersion(VersionProvider.CurrentSVNRevision)]
private string GetAdditionalVersionInfo()
{
    var assembly = Assembly.GetEntryAssembly();
    var attributesFound = assembly.GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), true);

    var version = attributesFound.OfType<AssemblyInformationalVersionAttribute>().FirstOrDefault();

    return version != null ? version.InformationalVersion : String.Empty;
}