【问题标题】:Should .NET Assembly names include a version number?.NET 程序集名称是否应该包含版本号?
【发布时间】:2008-11-21 21:18:24
【问题描述】:

我们目前就实际的 .NET 程序集名称是否应包含代码的版本号(例如 CodeName02.exe 或 CompanyName.CodeName02.dll)存在激烈的内部争论。有谁知道像微软这样的权威来源可以提供有关此问题的指导?

【问题讨论】:

    标签: .net naming


    【解决方案1】:

    这就是 Properties/AssemblyInfo.cs 文件的用途。

    该文件中有两个版本,文件版本和程序集版本:

    [assembly: AssemblyVersion("1.1.0.256"]
    [assembly: AssemblyFileVersion("1.1.0.256")]
    

    一旦设置好这些,您就可以使用它们来跟踪您的二进制文件的版本。它可以在资源管理器中通过右键单击->属性轻松查看。

    Microsoft 的应用程序(和操作系统)中包含的任何 dll 或 exe 名称都不使用该约定。

    其他系统将使用这些数字来解决依赖关系并验证版本。例如,MSI 系统将根据版本属性更新二进制文件。

    【讨论】:

    • 如何在每次构建后自动增加构建号?还是我每次都必须手动打开这个文件并更改maj、min、build number?
    • 使用 and * 而不是数字,构建将自动增加值。 1.1.*
    • 您还可以设置 AssemblyInformationalVersion 最终作为“ProductVersion”VERSIONINFO 字段。
    • ray247,这是我们遇到的一个问题——我们使用svn号处理了它。涉及预构建事件、vbs 脚本和最后的 svn revert 的一些 hack。
    • 如果您使用版本更改程序集名称,则程序集的使用者将需要更新其引用才能使用新版本,而不仅仅是重新编译。
    【解决方案2】:

    Framework Design Guidelines by Krzysztof Cwalina 和 Microsoft 的 Brad Abrams 建议将程序集命名为

    <Company>.<Component>.dll
    

    我进一步支持这一点(不使用版本号),因为 GAC 和 dll 文件属性将显示版本。

    【讨论】:

    • 而且,如前所述,可以通过 AssemblyInfo.cs 中的 Assembly 属性访问程序集版本
    【解决方案3】:

    我知道 DevExpress website 使用版本指示符作为其程序集名称的一部分,例如 XtraEditors8.2.dll。我猜原因是您希望能够在同一目录中拥有多个版本的程序集。例如,我们有大约 15 个智能客户端,它们作为同一个外壳/客户端的一部分分布。每个 smartclient 可以有不同版本的 DevExpress 控件,因此我们需要能够让 XtraEditors7.1.dll 和 XtraEditors8.2 存在于同一目录中。

    我会说,如果您有公共库是可重用模块的依赖项并且可以存在于多个版本 1.0、1.1、1.2 等中,那么可以在名称中包含版本号以避免冲突是一个有效的论点.鉴于通用库不在 GAC 中。

    【讨论】:

    • 我这样做正是出于这个原因,我在多个程序和人员使用的网络驱动器上共享了 dll。如果正常运行时间出现问题,我可以升级依赖它的 dll 和程序,而不会影响用户。
    【解决方案4】:

    我不知道有什么权威的,但在我看来,使用一致的名称可以简化从安装脚本到文档的所有过程。鉴于可以将版本作为元数据存储在文件中,我不知道为什么在文件名中需要它。为什么要为必须考虑不同名称的文件而烦恼?

    【讨论】:

      【解决方案5】:

      只需查看 .NET 框架或任何其他 Microsoft 产品即可。将版本号作为程序集名称的一部分听起来是个坏主意。

      在程序集的元数据部分中有此(和其他信息)的位置。 (AssemblyInfo.cs)

      可以在 Windows 资源管理器中查看此信息(属性对话框、状态栏、工具提示 - 它们都显示此信息)。

      【讨论】:

        【解决方案6】:

        我认为在 DLL 的文件名中添加版本号的主要思想是从 DLL Hell 中引入的,在这种情况下,DLL 的多个版本都具有相同的名称会导致问题(即您拥有哪个 DLL 的实际版本以及它是否具有所需的功能等)。

        与更传统的 C/C++ DLL 文件相比,.NET 框架处理的依赖关系完全不同,GAC 中可能有多个版本的库,主要是因为 GAC 是一个链接的“假”文件夹到文件系统上的其他文件,除了能够将程序集包含在可执行安装中(相同的文件夹部署等)。

        【讨论】:

          【解决方案7】:

          版本信息可以包含在 assemblyInfo 文件中,然后可以通过反射等方式查询。

          一些供应商在名称中包含版本号,以便一目了然。 Microsoft dll 名称在框架目录中不包含版本号。

          【讨论】:

            【解决方案8】:

            既然版本可以设置为属性,这不是半多余的吗?

            如果快速浏览一下它们的 DLL 名称,我也会建议 MS 没有标准:user32.dll、tcpmon.dll、winsock.dll 等。

            【讨论】:

            • 这些不是 .NET 组件 - 它们是原生 win32 并且受制于“DLL 地狱”。在 .NET 中,gac 用于提供版本控制并允许后续 DLL 具有相同的物理名称。
            • 我不确定引用 20 年的软件考古学是否非常相关!那个时代的名字必须是 8.3,这往往会主导辩论。
            【解决方案9】:

            Microsoft 使用后缀 32 来表示 32 位 DLL 版本,以便这些 DLL 可以与现有的 16 位 DLL 文件共存。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-11-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多