【发布时间】:2008-11-21 21:18:24
【问题描述】:
我们目前就实际的 .NET 程序集名称是否应包含代码的版本号(例如 CodeName02.exe 或 CompanyName.CodeName02.dll)存在激烈的内部争论。有谁知道像微软这样的权威来源可以提供有关此问题的指导?
【问题讨论】:
我们目前就实际的 .NET 程序集名称是否应包含代码的版本号(例如 CodeName02.exe 或 CompanyName.CodeName02.dll)存在激烈的内部争论。有谁知道像微软这样的权威来源可以提供有关此问题的指导?
【问题讨论】:
这就是 Properties/AssemblyInfo.cs 文件的用途。
该文件中有两个版本,文件版本和程序集版本:
[assembly: AssemblyVersion("1.1.0.256"]
[assembly: AssemblyFileVersion("1.1.0.256")]
一旦设置好这些,您就可以使用它们来跟踪您的二进制文件的版本。它可以在资源管理器中通过右键单击->属性轻松查看。
Microsoft 的应用程序(和操作系统)中包含的任何 dll 或 exe 名称都不使用该约定。
其他系统将使用这些数字来解决依赖关系并验证版本。例如,MSI 系统将根据版本属性更新二进制文件。
【讨论】:
Framework Design Guidelines by Krzysztof Cwalina 和 Microsoft 的 Brad Abrams 建议将程序集命名为
<Company>.<Component>.dll
我进一步支持这一点(不使用版本号),因为 GAC 和 dll 文件属性将显示版本。
【讨论】:
我知道 DevExpress website 使用版本指示符作为其程序集名称的一部分,例如 XtraEditors8.2.dll。我猜原因是您希望能够在同一目录中拥有多个版本的程序集。例如,我们有大约 15 个智能客户端,它们作为同一个外壳/客户端的一部分分布。每个 smartclient 可以有不同版本的 DevExpress 控件,因此我们需要能够让 XtraEditors7.1.dll 和 XtraEditors8.2 存在于同一目录中。
我会说,如果您有公共库是可重用模块的依赖项并且可以存在于多个版本 1.0、1.1、1.2 等中,那么可以在名称中包含版本号以避免冲突是一个有效的论点.鉴于通用库不在 GAC 中。
【讨论】:
我不知道有什么权威的,但在我看来,使用一致的名称可以简化从安装脚本到文档的所有过程。鉴于可以将版本作为元数据存储在文件中,我不知道为什么在文件名中需要它。为什么要为必须考虑不同名称的文件而烦恼?
【讨论】:
只需查看 .NET 框架或任何其他 Microsoft 产品即可。将版本号作为程序集名称的一部分听起来是个坏主意。
在程序集的元数据部分中有此(和其他信息)的位置。 (AssemblyInfo.cs)
可以在 Windows 资源管理器中查看此信息(属性对话框、状态栏、工具提示 - 它们都显示此信息)。
【讨论】:
我认为在 DLL 的文件名中添加版本号的主要思想是从 DLL Hell 中引入的,在这种情况下,DLL 的多个版本都具有相同的名称会导致问题(即您拥有哪个 DLL 的实际版本以及它是否具有所需的功能等)。
与更传统的 C/C++ DLL 文件相比,.NET 框架处理的依赖关系完全不同,GAC 中可能有多个版本的库,主要是因为 GAC 是一个链接的“假”文件夹到文件系统上的其他文件,除了能够将程序集包含在可执行安装中(相同的文件夹部署等)。
【讨论】:
版本信息可以包含在 assemblyInfo 文件中,然后可以通过反射等方式查询。
一些供应商在名称中包含版本号,以便一目了然。 Microsoft dll 名称在框架目录中不包含版本号。
【讨论】:
既然版本可以设置为属性,这不是半多余的吗?
如果快速浏览一下它们的 DLL 名称,我也会建议 MS 没有标准:user32.dll、tcpmon.dll、winsock.dll 等。
【讨论】:
Microsoft 使用后缀 32 来表示 32 位 DLL 版本,以便这些 DLL 可以与现有的 16 位 DLL 文件共存。
【讨论】: