我在C#中将.Net 3.5 / 4.0与代码一起使用。
我正在尝试在C:驱动器上获取exe文件的版本号。
例如,路径为:c:\ Program \ demo.exe。如果demo.exe的版本号是1.0。
我如何使用此路径获取版本号?
Answers:
您可以使用FileVersionInfo.FileVersion从路径中获取它。
var versionInfo = FileVersionInfo.GetVersionInfo(pathToExe);
string version = versionInfo.FileVersion; // Will typically return "1.0.0.0" in your case
更新和更新了2018年(例如,C#6的字符串插值):
接受的答案部分不正确(ProductVersion通常不返回由三部分组成的版本),并且有点误导性:
这是一个更完整的答案。为了使主体文本不太冗长,我将其拆分为简短的摘要,对于很多人来说这可能“足够”。您没有义务阅读第二部分的详细内容,因此请不要tl; dr :-)
简短的摘要:
每个文件都有不同的版本(程序集版本,文件版本,产品版本),但是通常您将使它们全部等于在文件级别上不会出现“版本地狱”(这将足够早了)。
文件版本(在资源管理器中可见,并在设置/安装中使用)是我要打扰的最重要的版本。
为此,只需在AssemblyInfo.cs文件中注释掉文件版本,如下所示。这样可确保一个文件的三个可能的不同版本相同!
[assembly:AssemblyVersion(“ 1.1.2。”)]
// [assembly:AssemblyFileVersion(“ 1.1.2。 ”)]
例如,对于语义版本控制,您只希望从4个版本中获取3个版本部分:
对每个Visual Studio生成都有一个自动生成计数是有用的。但是,这种内部计数并不是总是有用的,它可以告诉您的内部或外部客户。因此,对于在标题对话框中提及Windows的文件版本,我建议仅显示v1.2.3的三个部分(当然还有语义版本控制):
using System.Diagnostics;
...
var versInfo= FileVersionInfo.GetVersionInfo(pathToVersionedFile);
string fileVersionFull = versInfo.FileVersion; // No difference here for versinfo.ProductVersion if recommendation in AssemblyInfo.cs is followed
string fileVersionSemantic = $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
string fileVersionFull2 = $"V{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}.{versInfo.FilePrivatePart}";
FileVersionFull2只是显示如何处理所有4个部分,除了“ V”部分与FileVersionFull相同。
细节:
首先是有关如何获取和设置三个版本的备忘单:
文件版本: [assembly:AssemblyFileVersion(..)] => System.Diagnostics.FileVersionInfo.FileVersion
产品版本: [assembly:AssemblyInformationalVersion(..)] => System.Diagnostics.FileVersionInfo.ProductVersion
组装版本: [assembly:AssemblyVersion(..)] => System.Reflection.Assembly.Version
特别是默认设置可能会造成混淆。推荐的SO链接以了解详细信息:FileVersionInfo和AssemblyInfo
EntryAssembly与ExecutingAssembly
要全面考虑每种情况以获取正在运行的应用程序的版本,请在其他位置搜索以获取更多详细信息,例如:这里:
哪种方法更适合获取程序集的位置,GetAssembly()。Location或GetExecutingAssembly()。Location
尤其是可以如果应该使用EntryAssembly或ExecutingAssembly,请感到困惑。他们都有优势和警告。如果以下代码与.exe不在同一程序集中,例如在辅助程序集中,则情况将变得更加复杂。通常,您随后将使用EntryAssembly来获取.exe的版本。
但是:为了使Visual Studio中的单元测试能够测试并行.exe项目中的例程,GetEntryAssembly()不起作用(我的环境:NUnit,VS2017)。但是GetExecutingAssembly()至少不会崩溃,只有在单元测试期间,您才能获得测试项目的程序集版本。对我来说足够好了。有些情况可能不那么简单。
如果需要,可以忽略静态声明,从而可以在一个程序中获得多个不同程序集的版本。
public static class AppInfo
{
public static string FullAssemblyName { get; }
..
static AppInfo()
{
Assembly thisAssembly = null;
try
{
thisAssembly = Assembly.GetEntryAssembly();
}
finally
{
if (thisAssembly is null)
thisAssembly = Assembly.GetExecutingAssembly();
}
FullAssemblyName = thisAssembly.Location;
var versInfo = FileVersionInfo.GetVersionInfo(FullAssemblyName);
..
}
}
产品版本与文件版本:文件的版本
也显示在Windows资源管理器中。我建议最大程度地区分“客户可见”文件(主要是应用程序的主要.exe)中的ProductVersion和FileVersion。但是,当然可以选择区分“主”应用程序的每个文件,并让他们都拥有客户看到的所有“营销” ProductVersion。但是经验表明,过多地同步技术版本和市场版本既没有必要也不便宜。混乱并没有真正减少,成本增加了。因此,本文第一部分中描述的解决方案应该主要这样做。
历史:程序集版本与文件版本: 具有不同版本的原因之一还在于,一个.NET程序集最初可以由多个文件(模块)组成-从理论上讲。Visual Studio不使用此功能,其他地方很少使用。这可能是历史原因,使得有可能区分这两个版本。从技术上讲,程序集版本与.NET相关版本(例如GAC和并排版本)相关,文件版本与经典设置(例如,更新期间覆盖或共享文件)更相关。
在接受的答案中,引用了“ pathToExe”。
可以按以下方式检索和使用此路径:
var assembly = Assembly.GetExecutingAssembly();
var fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
var version = fvi.FileVersion; // or fvi.ProductVersion
希望这可以使某人免于执行一些不必要的额外步骤。
我不确定这是否是您要寻找的东西,但是:
http://www.daniweb.com/software-development/csharp/threads/276174/c-code-to-get-dll-version
它说,
// Get the file version info for the notepad.
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.SystemDirectory + "\\notepad.exe");
// Print the file name and version number.
Console.WriteLine("File: " + myFileVersionInfo.FileDescription + '\n' + "Version number: " + myFileVersionInfo.FileVersion);
使用它,它可以工作:
using System.Reflection;
string v = AssemblyName.GetAssemblyName("Path/filename.exe").Version.ToString();
解决方案1
Dim fileVer As FileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.CurrentDirectory + "\yourExe.exe")
yourLabel.Text = fileVer.FileVersion
解决方案2
获取文件版本号
yourLabel.Text = Application.ProductVersion
两种解决方案都将给出1.0.0.0
Application.ProductVersion
通常输出1.0.0,而不是1.0.0.0