C# 如何获取程序集文件版本
在C# 如何获取程序集文件版本,c#,.net,assemblies,version,C#,.net,Assemblies,Version,在AssemblyInfo中有两个程序集版本: AssemblyVersion:指定要属性化的程序集的版本 AssemblyFileVersion:指示编译器为Win32文件版本资源使用特定的版本号。Win32文件版本不要求与程序集的版本号相同 我可以通过以下代码行获得汇编版本: Version version = Assembly.GetEntryAssembly().GetName().Version; 但是我如何才能获得汇编文件版本呢?更新:正如Richard Grimes在@Iain和
AssemblyInfo
中有两个程序集版本:
AssemblyVersion
:指定要属性化的程序集的版本AssemblyFileVersion
:指示编译器为Win32文件版本资源使用特定的版本号。Win32文件版本不要求与程序集的版本号相同汇编版本
:
Version version = Assembly.GetEntryAssembly().GetName().Version;
但是我如何才能获得
汇编文件版本呢?更新:正如Richard Grimes在@Iain和@Dmitry Lobanov中提到的,我的答案在理论上是正确的,但在实践中是错误的
正如我在无数书籍中所记得的那样,当人们使用[assembly:XXXAttribute]
设置这些属性时,编译器会将它们提升到VERSIONINFO
资源中
出于上述原因,您需要使用中的方法,因为从属性中提取信号后,属性将被剥离
公共静态字符串GetProductVersion()
{
var属性=(AssemblyVersionAttribute)程序集
.getExecutionGassembly()
.GetCustomAttributes(typeof(AssemblyVersionAttribute),true)
.Single();
返回attribute.InformationalVersion;
}
(From-如上所述,如果您正在寻找不同的属性,请将其替换为上述属性)
请参阅我上面的评论,要求澄清您真正想要什么。希望是这样:
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location);
string version = fvi.FileVersion;
有:组件、文件和产品。它们由不同的功能使用,如果不显式指定它们,则采用不同的默认值
string assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
string assemblyVersion = Assembly.LoadFile("your assembly file").GetName().Version.ToString();
string fileVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion;
string productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
当我想访问应用程序文件版本(在程序集信息->文件版本中设置的内容)时,比如说在表单加载时为其设置标签文本以显示版本,我刚刚使用
versionlabel.Text = "Version " + Application.ProductVersion;
此方法要求引用
System.Windows.Forms使用以下方法:
((AssemblyFileVersionAttribute)Attribute.GetCustomAttribute(
Assembly.GetExecutingAssembly(),
typeof(AssemblyFileVersionAttribute), false)
).Version;
或者这个:
new Version(System.Windows.Forms.Application.ProductVersion);
与“程序集版本”相对的“程序集文件版本”是什么意思?你能举个例子吗?@Xiaofu--“汇编版本”是.NET内部使用的。“程序集文件版本”是指在文件上单击鼠标右键,然后转到“属性”和“详细信息”选项卡时显示的内容。它们不一样。我发现在确定AppData中的user.config位置时使用的是程序集版本。嘿,鲁本,注意2。首先,询问的问题是AssemblyFileVersion而不是AssemblyVersion。其次,Assembly.getExecutionGassembly().GetCustomAttributes(typeof(AssemblyVersionAttribute),true)返回长度为0的数组。我认为这是因为AssemblyVersionAttribute不是一个自定义属性。你是第一点,这就是为什么我说“如果你在寻找一个不同的属性,请将其替换为上面的属性”(IIRC我没有尝试过)。你是第二个,这似乎有道理,但没有时间深入研究…是的,你实际上无法通过.GetCustomAttribute()获取AssemblyVersion属性,只能通过
AssemblyName.version
属性检索程序集版本。但对于所有其他属性,这都是正确的方法it@DmitryLobanov伊恩,谢谢你的提示。我希望编辑足够涵盖它,使答案值得保留而不是删除-让我知道!我在.net core 3上使用了AssemblyInformationalVersionAttribute
而不是AssemblyVersionAttribute
。1@Xiaofu:是否有办法从AssemblyInfo.cs文件获取版本号?此代码的一个问题是,如果未指定版本号和修订号,它实际上将返回1.0.*.*。AssemblyName.GetAssemblyName(assembly.Location).Version.ToString();将获得“已编译”的版本号-如果您以相同的方式设置两个版本,则该版本号应与FileVersion相同。@DoguhanUluca它们是两个不同的东西。这将为您提供程序集版本,而不是文件版本。“如果您以相同的方式设置两个版本”,这是一种解决方法,而不是解决方案。FileVersionInfo
是否只有string
属性,而没有Version
属性?@Yitzchak:Assembly.GetEntryAssembly()
在Office加载项上下文中以及许多其他情况下返回NULL。此外,如果您考虑加载项/插件-EntryAssembly是主机应用程序,并且除此之外,您通常还需要代码的版本(TM):),值得在回答中添加以下内容:回答中使用的assembly.Location
也可以为空(即,谷歌搜索出的第一个随机案例:)这可能比使用null entry-assembly更为常见。请注意,这需要对System.Windows.Forms的引用,因此可能不适用于所有应用程序。不幸的是,这是一个字符串。如果您想自己将其格式化为更简单的“v1.08”格式,则这并不理想。如果您实际获取版本对象以获取子组件作为整数,则更方便。此外,这会从AssemblyInfo中获取AssemblyFileVersion,而不是AssemblyVersion,因此请注意,高代表性用户是否可以编辑此答案,以更清楚地说明此答案仅适用于Windows窗体?这正是我要查找的,谢谢回答!当这篇博文有一天消失时,这里将其浓缩为参考:string assemblyVersion=Assembly.getExecutionGassembly().GetName().Version.ToString();string assemblyVersion=Assembly.LoadFile(“您的程序集文件”).GetName().Version.ToString();字符串fileVersion=FileVersionInfo.GetVersionInfo(Assembly.GetExecutionGassembly().Location).fileVersion;字符串productVersion=FileVersionInfo.GetVersionInfo(Assembly.GetExecutionGassembly().Location).productVersion代码>对于那些希望在AssemblyInfo.cs文件中指定这些的人,对于assemblyVersion使用(使用您想要的任何数字)==[assembly:assemblyVersion(“2.0.*”)]
对于fileVersion使用===new Version(System.Windows.Forms.Application.ProductVersion);