掌握程序集版本控制与多语言支持:.NET开发必备知识
“在.NET开发中,程序集的版本控制和多语言支持是关键而常被忽视的技术细节
程序集版本资源信息
当使用AL.exe或CSC.exe生成PE文件程序集时,会在PE文件中嵌入标准的Win32版本资源。用户可以通过查看文件属性来检查这些信息,或者在应用程序代码中调用System.Diagnostics.FileVersionInfo的静态方法GetVersionInfo来获取。
设置版本资源的定制Attribute
生成程序集时,应使用定制attribute来设置版本资源字段:
using System.Reflection;
// 文件描述版本信息
[assembly: AssemblyTitle("JeffTypes.dll")]
// 注释版本信息
[assembly: AssemblyDescription("This assembly contains Jeff's types")]
// 公司名称版本信息
[assembly: AssemblyCompany("Wintellect")]
// 产品名称版本信息
[assembly: AssemblyProduct("Wintellect (R) Jeff's Type Library")]
// 版权版本信息
[assembly: AssemblyCopyright("Copyright (c) Wintellect 2010")]
// 商标版本信息
[assembly: AssemblyTrademark("JeffTypes is a registered trademark of Wintellect")]
// 程序集版本信息
[assembly: AssemblyVersion("3.0.0.0")]
// 文件版本信息
[assembly: AssemblyFileVersion("1.0.0.0")]
// 产品版本信息
[assembly: AssemblyInformationalVersion("2.0.0.0")]
// 设置语言文化字段
[assembly: AssemblyCulture("")]
版本资源字段与对应工具
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
版本号详解
程序集版本号由四个部分组成,格式为:主版本号.次版本号.内部版本号.修订号
示例:2.5.719.2
-
主版本号和次版本号构成公众认知的版本(如2.5版本) -
内部版本号表示每日生成的递增编号 -
修订号表示当前内部版本的修订次数
三种版本号的区别
-
AssemblyFileVersion
-
存储在Win32版本资源中,仅供参考 -
CLR不检查此版本号 -
用于标识程序集的具体版本,便于故障诊断 -
AssemblyInformationalVersion
-
同样存储在Win32版本资源中,仅供参考 -
表示包含该程序集的产品版本 -
用于标识完整产品的公开发布版本 -
AssemblyVersion
-
存储在AssemblyDef元数据表中 -
CLR在绑定强命名程序集时使用此版本号 -
唯一标识程序集,极为重要 -
引用的程序集版本会嵌入到AssemblyRef表中
语言文化支持
除了版本号,程序集还将语言文化作为身份标识的一部分。
语言文化标识
语言文化使用字符串标识,包含主标记和副标记:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
语言文化中性与附属程序集
-
语言文化中性程序集:不指定具体语言文化,包含代码和默认资源 -
附属程序集:标记具体语言文化,只包含语言文化特定的资源(不包含代码)
最佳实践
-
主程序集应设计为语言文化中性,包含默认资源 -
为每种支持的语言文化创建单独的附属程序集 -
使用AL.exe工具的 /culture:text开关生成附属程序集 -
部署时,将附属程序集保存在与语言文化匹配的子目录中 -
例如: C:\MyApp\en-US\对应美国英语资源 -
使用 System.Resources.ResourceManager类在运行时访问附属程序集资源
总结
掌握程序集版本控制和多语言支持是.NET开发中的重要技能。正确使用三种版本号可以确保程序集的正确标识和依赖管理,而合理的语言文化策略则为应用程序的国际化奠定坚实基础。记住,AssemblyVersion是CLR实际使用的版本标识,而其他版本号主要用于信息展示和产品管理。

