0

我已经使用此处非常有用的信息在我的 c# dll 中构建了一个版本信息命令: 显示构建日期

我实际上将一个范围输出到 excel 中,其中显示了一些文本、程序集信息和构建日期/时间等。理想情况下,我会说“在 2013 年 8 月 23 日 10:24:30 由用户名构建”。我怎样才能得到那个用户名(登录ID很好)?

谢谢克雷格

---回应评论,请参阅下面的更多信息 - 上述问题仍然存在

嗨,如果它有助于让可能对这个线程感兴趣的人更清楚地了解我的情况,我将描述我公司的情况:可能最多有 3 人开发代码,全部用 VS 编译,我们只在 Windows 系统上工作(8)。用户群最多20人。这些代码是通过 svn 进行版本控制的,而且还处于原型阶段,所以我们还没有进入正式的发布周期。然而,在白天,我们三个人很可能会进行一些更改并发布给选定的用户,因此在某些时候用户之间的版本可能会不同步。我想知道是否有用户向我抱怨谁给了他们那个版本的东西不起作用。如果它不起作用,那么很可能是改变的人 & 编译代码对他们自己的东西做了一些更改,并没有运行回归测试并将代码发布给一些用户。我想很快知道谁通过我在这里提出问题的方法进行了编码和发布/编译,所以我可以去找到他们并给他们一记耳光,而不必挖掘 Svn 更改日志(其中甚至可能没有更改,因为更改未签入)。所以希望现在已经完全清楚了——我同意这是一个相当非正式的安排,但它在我们工作的环境中有效。请不要对代码发布周期等进行讲座,我相信解决方案足够简单,我不确定更改线程标题会有什么帮助 - 这正是我想要做的。谢谢克雷格 我想很快知道谁通过我在这里提出问题的方法进行了编码和发布/编译,所以我可以去找到他们并给他们一记耳光,而不必挖掘 Svn 更改日志(可能不会甚至已更改,因为未签入更改)。所以希望现在已经完全清楚了——我同意这是一个相当非正式的安排,但它在我们工作的环境中有效。请不要对代码发布周期等进行讲座,我相信解决方案足够简单,我不确定更改线程标题会有什么帮助 - 这正是我想要做的。谢谢克雷格 我想很快知道谁通过我在这里提出问题的方法进行了编码和发布/编译,所以我可以去找到他们并给他们一记耳光,而不必挖掘 Svn 更改日志(可能不会甚至已更改,因为未签入更改)。所以希望现在已经完全清楚了——我同意这是一个相当非正式的安排,但它在我们工作的环境中有效。请不要对代码发布周期等进行讲座,我相信解决方案足够简单,我不确定更改线程标题会有什么帮助 - 这正是我想要做的。谢谢克雷格 无需深入研究 Svn 更改日志(甚至可能没有更改,因为未签入更改)。所以希望现在已经完全清楚了——我同意这是一个相当非正式的安排,但它在我们工作的环境中有效。请不要对代码发布周期等进行讲座,我相信解决方案足够简单,我不确定更改线程标题会有什么帮助 - 这正是我想要做的。谢谢克雷格 无需深入研究 Svn 更改日志(甚至可能没有更改,因为未签入更改)。所以希望现在已经完全清楚了——我同意这是一个相当非正式的安排,但它在我们工作的环境中有效。请不要对代码发布周期等进行讲座,我相信解决方案足够简单,我不确定更改线程标题会有什么帮助 - 这正是我想要做的。谢谢克雷格

4

2 回答 2

1

尽管您已经通过阅读 PE 标头实现了版本信息,但这并不是严格要求的。

要在不阅读 PE 标头的情况下解决您的问题,您可以:

  1. 定义自定义属性

    [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
    internal sealed class BuildInfoAttribute : Attribute 
    {
        public string UserName
        {
            get; private set;
        }
    
        public string BuildDate
        {
            get; private set;
        }
    
        public BuildInfoAttribute(string username, string buildDate)
        {
            UserName = username;
            BuildDate = buildDate;
        }
    }
    
  2. 在 AssemblyInfo.cs 中包含该属性

    [assembly: BuildInfo("AmitMittal", "08/23/2012 17:40:16")]
    
  3. 下载并安装MSBuild 社区任务。请记住选择与 VS 集成的选项

  4. 在文本编辑器中打开 .csproj 文件,并在</Project>标记之前包含以下行

    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
    <PropertyGroup>
      <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>
    </PropertyGroup>
    <Target Name="BeforeBuild">
    <Time>
      <Output PropertyName="BuildDateTime" TaskParameter="FormattedTime" />
    </Time>
    <FileUpdate Files="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs" Regex="BuildInfo\(.*" ReplacementText="BuildInfo(&quot;$(USERNAME)&quot;,&quot;$(BuildDateTime)&quot;)]" Condition="'$(Configuration)' == 'Release'" />
    </Target>
    
  5. 以发布模式构建以对您的项目进行时间戳记

  6. 获取 BuildInfo 如下:

    var attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof (BuildInfoAttribute), false);
    BuildInfoAttribute attribute = (BuildInfoAttribute) attributes[0];
    Console.WriteLine("Built by " + attribute.UserName + " on " + attribute.BuildDate);
    
于 2012-08-23T12:17:31.700 回答
0

您可以使用 Environment.UserName:

var username = Environment.Username;

请参阅此处获取文档 - http://msdn.microsoft.com/en-us/library/system.environment.username.aspx

您还可以使用 WindowsIdentity。在这种情况下,如果我记得它还包括域名(如果适用):

var username = WindowsIdentity.GetCurrent().Name;
于 2012-08-23T09:29:55.987 回答