我正在使用带有 C# 代码的 .Net 3.5/4.0。
我试图在我的 C: 驱动器上获取 exe 文件的版本号。
例如路径是:c:\Program\demo.exe。如果demo.exe的版本号是1.0。
如何使用此路径获取版本号?
我正在使用带有 C# 代码的 .Net 3.5/4.0。
我试图在我的 C: 驱动器上获取 exe 文件的版本号。
例如路径是:c:\Program\demo.exe。如果demo.exe的版本号是1.0。
如何使用此路径获取版本号?
您可以使用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文件中注释掉 fileversion,如下所示。这确保了一个文件的三个可能的不同版本是相同的!
[程序集:AssemblyVersion("1.1.2. ")]
//[程序集: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 个部分,除了它包含与FileVersionFull相同的“V” 。
细节:
首先是关于如何获取和设置三个版本的备忘单:
文件版本: [程序集:AssemblyFileVersion(..)] => System.Diagnostics.FileVersionInfo.FileVersion
产品版本: [程序集:AssemblyInformationalVersion(..)] => System.Diagnostics.FileVersionInfo.ProductVersion
程序集版本: [程序集: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
希望这可以避免有人做一些不必要的额外步骤。
Program
你的班级名称在哪里:
Console.WriteLine("Version = " + typeof(Program).Assembly.GetName().Version.ToString()) ;
我不确定这是否是您正在寻找的,但是:
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();
这很好用并返回 AssemblyVersion 中提供的版本:
using System.Reflection;
infoFileVersionInfo versInfo = FileVersionInfo.GetVersionInfo("path.exe");
string version = $"v{versInfo.FileMajorPart}.{versInfo.FileMinorPart}.{versInfo.FileBuildPart}";
解决方案 1
Dim fileVer As FileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.CurrentDirectory + "\yourExe.exe")
yourLabel.Text = fileVer.FileVersion
解决方案 2
获取文件版本号
yourLabel.Text = Application.ProductVersion
两种解决方案都会给出 1.0.0.0