有三个程序集版本属性。有什么区别?如果我使用AssemblyVersion
并忽略其余部分,这样可以吗?
MSDN说:
指定要归因的程序集的版本。
指示编译器为Win32文件版本资源使用特定版本号。 Win32文件版本不需要与程序集的版本号相同。
定义程序集清单的其他版本信息。
这是对What are the best practices for using Assembly Attributes?
的跟进答案 0 :(得分:867)
<强>的AssemblyVersion 强>
引用装配的其他装配将显示的位置。如果此数字更改,其他程序集必须更新其对程序集的引用! AssemblyVersion
是必需的。
我使用的格式为: major.minor 。这将导致:
[assembly: AssemblyVersion("1.0")]
<强>的AssemblyFileVersion 强>
用于部署。您可以为每个部署增加此数量。它由安装程序使用。使用它来标记具有相同AssemblyVersion
但是从不同构建生成的程序集。
在Windows中,可以在文件属性中查看。
如果可能,让它由MSBuild生成。 AssemblyFileVersion是可选的。如果没有给出,则使用AssemblyVersion。
我使用的格式为: major.minor.revision.build ,其中我使用修订版进行开发阶段(Alpha,Beta,RC和RTM),服务包和热修复。这将导致:
[assembly: AssemblyFileVersion("1.0.3100.1242")]
<强> AssemblyInformationalVersion 强>
装配的产品版本。这是您与客户交谈或在您的网站上显示时使用的版本。此版本可以是字符串,例如“ 1.0 Release Candidate ”。
代码分析会抱怨它(CA2243) - reported to Microsoft(VS2013中没有修复)。
AssemblyInformationalVersion
是可选的。如果没有给出,则使用AssemblyFileVersion。
我使用的格式为: major.minor [revision as string] 。这将导致:
[assembly: AssemblyInformationalVersion("1.0 RC1")]
答案 1 :(得分:568)
答案 2 :(得分:41)
AssemblyVersion
几乎保留在.NET内部,而AssemblyFileVersion
是Windows所见。如果您转到位于目录中的程序集的属性并切换到版本选项卡,AssemblyFileVersion
就是您最常见到的内容。如果按版本对文件进行排序,则这就是资源管理器使用的内容。
AssemblyInformationalVersion
映射到“产品版本”,并且纯粹是“人类使用”。
AssemblyVersion
肯定是最重要的,但我也不会跳过AssemblyFileVersion
。如果您不提供AssemblyInformationalVersion
,编译器会通过剥离版本号的“修订版”部分并保留major.minor.build来为您添加。
答案 3 :(得分:21)
AssemblyInformationalVersion
和AssemblyFileVersion
。这些属性实际上被编译到由编译器创建的VERSION_INFO
资源中。
AssemblyInformationalVersion
是“产品版本”值。 AssemblyFileVersion
是“文件版本”值。
AssemblyVersion
特定于.NET程序集,.NET程序集加载程序使用它来了解在运行时加载/绑定的程序集版本。
其中,.NET唯一需要的是AssemblyVersion
属性。不幸的是,当它不加选择地改变时,它也会导致大多数问题,特别是如果你强烈命名你的程序集。
答案 4 :(得分:7)
值得注意的是其他一些事情:
1)如生成的程序集文件的Windows资源管理器属性对话框所示,有两个名为“文件版本”的地方。在对话框的标题中看到的那个显示AssemblyVersion,而不是AssemblyFileVersion。
在“其他版本信息”部分中,还有另一个名为“文件版本”的元素。您可以在此处查看作为AssemblyFileVersion输入的内容。
2)AssemblyFileVersion只是纯文本。它不必符合AssemblyVersion所做的编号方案限制(&lt; build&gt;&lt; 65K,例如)。它可以是3.2。&lt; release tag text&gt;。&lt; datetime&gt;,如果你愿意的话。您的构建系统必须填写令牌。
此外,它不受AssemblyVersion的通配符替换。如果您在AssemblyInfo.cs中只有一个值“3.0.1。*”,那么这正是将在其他版本信息 - &gt;文件版本元素中显示的内容。
3)不过,我不知道安装程序对使用数字文件版本号以外的东西的影响。
答案 5 :(得分:7)
为了使这个问题保持最新状态,值得强调的是,NuGet使用AssemblyInformationalVersion
并反映包版本,包括任何预发布后缀。
例如,使用asp.net core dotnet-cli打包的1.0.3。*的AssemblyVersion
dotnet pack --version-suffix ci-7 src/MyProject
使用版本1.0.3-ci-7生成一个包,您可以使用反射检查:
CustomAttributeExtensions.GetCustomAttribute<AssemblyInformationalVersionAttribute>(asm);
答案 6 :(得分:2)
当程序集的AssemblyVersion发生变化时, 如果它具有强名称,则需要重新编译引用程序集,否则程序集不会加载! 如果它没有强名称,如果没有显式添加到项目文件中,则在构建时不会将其复制到输出目录,因此您可能会错过依赖于程序集,特别是在清理输出目录之后。