【问题标题】:How to add custom build data to a .net dll如何将自定义构建数据添加到 .net dll
【发布时间】:2014-06-17 16:17:23
【问题描述】:

我正在开发一个 winforms 应用程序,我们每天多次在 DEV 服务器上部署 dll。我们希望能够找出谁构建了 dll。

我尝试将 System.Security.Principal.WindowsIdentity.GetCurrent().Name 添加到程序集信息,但它只需要 const。

有没有办法在构建过程中将用户名嵌入到 dll 中?

【问题讨论】:

  • 使用构建服务器怎么样?

标签: c# .net vb.net winforms visual-studio-2010


【解决方案1】:

StackOverflow 和Coding Horror 提供了创建自定义程序集属性的示例。根据这些示例,您可以创建如下内容:

[AttributeUsage(AttributeTargets.Assembly)]
public class AssemblyBuildSystem : System.Attribute
{
    private string _strBuildSystemName;

    public AssemblyBuildSystem(string buildSystemName)
    {
        _strBuildSystemName = buildSystemName;
    }

    public BuildSystemName { get { return _strBuildSystemName; } }
}

这将为您提供一个自定义的“AssemblyBuildSystemName”属性,您可以通过反射检查该属性。问题在于确保它在每次构建时都是正确的,因为属性只能采用常量参数。

您可以像往常一样将属性添加到程序集中:

[Assembly: AssemblyBuildSystemName("Bob's Development Machine")]

缺点是您不希望它受源代码控制,因此它可能应该驻留在特定于每个开发人员机器的非源代码控制的 .cs 文件中。您必须依靠每个开发人员来创建文件,确保它不受源代码控制,并确保内容准确无误。

您可能可以modify the project target 将主机名作为条件编译常量传递,或者创建并添加该文件作为预构建步骤,但在某些时候使用构建服务器会变得更容易或修改您的部署流程。

【讨论】:

  • 我们的团队很大,我们不能依赖开发人员将他们的名字添加到文件中。我们想要在构建时读取用户 ID 并将其嵌入到 dll 中的东西。我们可以用 .resx 文件做些什么吗?
  • 不是我能想到的。如果要在AssemblyInfo中,需要定义一个属性,属性参数必须是常量。我认为你能做的最好的事情是创建一个读取当前用户名并更新 .cs 文件的脚本,然后将其作为预构建脚本运行。
  • 我创建了一个新的控制台应用程序,它读取 assemblyinfo.cs 并修改属性(添加编译 dll 的人员用户名)并将这个新应用程序的 exe 添加到我的 windows 应用程序的 prebuild 事件中.所以现在当有人编译 dll 时,他们的 assemblyinfo.cs 文件会用他们的登录名更新,然后构建 dll,在运行时我们可以读取属性并获取构建 dll 的人的姓名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多