我们目前在内部就实际的.NET 程序集名称是否应该包含代码的版本号(例如CodeName02.exe 或CompanyName.CodeName02.dll)进行了激烈的内部辩论。有没有人知道像微软这样的权威来源可以提供关于这个问题的指导?
9 回答
这就是 Properties/AssemblyInfo.cs 文件的用途。
该文件中有两个版本,文件版本和程序集版本:
[assembly: AssemblyVersion("1.1.0.256"]
[assembly: AssemblyFileVersion("1.1.0.256")]
一旦设置好这些,您就可以使用它们来跟踪您的二进制文件的版本。可以在资源管理器中通过右键单击-> 属性轻松查看。
Microsoft 的应用程序(和操作系统)中包含的任何 dll 或 exe 名称都没有使用该约定。
其他系统将使用这些数字来解决依赖关系并验证版本。例如,MSI 系统将根据版本属性更新二进制文件。
微软的Krzysztof Cwalina和Brad Abrams的框架设计指南建议将程序集命名为
<Company>.<Component>.dll
我进一步支持这一点(不使用版本号),因为 GAC 和 dll 文件属性将显示版本。
我知道 DevExpress网站使用版本指示符作为其程序集名称的一部分,例如 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 名称在框架目录中不包含版本号。
由于版本可以设置为属性,这不是半多余的吗?
我也会冒险并建议 MS 没有标准,因为快速查看它们的 DLL 名称:user32.dll、tcpmon.dll、winsock.dll 等。
Microsoft used a suffix of 32 to denote 32 bit DLL versions so that those DLL's could coexist with the existing 16 bit DLL files.