Linux下如何查看Windows编译的Native AOT C#程序文件版本?
在Linux下读取针对Windows编译的Native AOT EXE文件版本的解决方案
针对Windows编译的Native AOT EXE是PE格式文件,其版本信息存储在PE资源节的VS_VERSION_INFO结构中。Linux下的FileVersionInfo.GetVersionInfo API主要针对.NET程序集(如DLL),对非.NET程序集的PE格式EXE支持有限,因此会返回null。以下是可行的解决方案:
方法一:使用PE文件解析库提取版本信息
借助跨平台PE文件解析库(如PeNet),直接读取PE资源中的版本信息,无需依赖系统API。
- 安装NuGet包:
PeNet - 示例代码:
using PeNet; using PeNet.Header.Resource; // 读取PE文件 var peFile = new PeFile(exePath); // 查找版本信息资源 var versionResource = peFile.ResourceDirectory?.FindVersionInfo(); if (versionResource != null) { // 方式1:从版本结构中拼接版本号 var fileVersion = $"{versionResource.FileVersionMS >> 16}.{versionResource.FileVersionMS & 0xFFFF}.{versionResource.FileVersionLS >> 16}.{versionResource.FileVersionLS & 0xFFFF}"; // 方式2:读取格式化的版本字符串(与Windows显示一致) var stringTable = versionResource.StringFileInfo?.FirstOrDefault()?.StringTable; var formattedVersion = stringTable?["FileVersion"]; }
该方法跨平台有效,只要目标文件是PE格式EXE即可解析。
方法二:编译时额外嵌入版本信息
在Native AOT编译阶段,将版本号写入其他便于读取的位置:
- 生成附带版本文件:编译时同步生成
version.txt文件并写入版本号,检测程序直接读取该文件内容。 - 嵌入自定义段:通过编译配置,将版本号嵌入EXE的自定义数据段,检测程序读取文件时扫描该段的固定标识,提取版本号。
方法三:借助Linux命令行工具解析
利用Linux下的PE资源提取工具,通过命令行方式获取版本信息:
- 安装工具包:
sudo apt-get install icoutils - 调用命令提取版本资源:
wrestool -x -t 14 your-app.exe
(其中14是VS_VERSION_INFO资源的类型ID)
3. 在检测程序中通过Process.Start执行该命令,捕获输出后解析版本字符串。
内容的提问来源于stack exchange,提问作者Alex Zaitsev
相关产品推荐
相关产品推荐

