protected VersionData GetVersion() { VersionData versionData = null; PEFile peFile = GetPEInfo(); if (peFile != null) { try { VsFixedFileInfo fileInfo = peFile.VersionInfo; if (fileInfo != null) { versionData = fileInfo.ToVersionData(); } } catch (Exception ex) when(ex is InvalidVirtualAddressException || ex is BadInputFormatException) { Trace.TraceError($"GetVersion: exception {ex.Message}"); } } else { // If we can't get the version from the PE, search for version string embedded in the module data string versionString = VersionString; if (versionString != null) { int spaceIndex = versionString.IndexOf(' '); if (spaceIndex < 0) { // It is probably a private build version that doesn't end with a space (no commit id after) spaceIndex = versionString.Length; } if (spaceIndex > 0) { if (versionString[spaceIndex - 1] == '.') { spaceIndex--; } string versionToParse = versionString.Substring(0, spaceIndex); try { Version version = System.Version.Parse(versionToParse); versionData = new VersionData(version.Major, version.Minor, version.Build, version.Revision); } catch (ArgumentException ex) { Trace.TraceError($"Module.GetVersion FAILURE: '{versionToParse}' '{versionString}' {ex}"); } } } else { Trace.TraceInformation($"Module.GetVersion no version string"); } } return(versionData); }
private IEnumerable <string> GetSpecialFiles() { var specialFiles = new List <string>(s_coreClrSpecialFiles); VsFixedFileInfo fileVersion = _peFile.VersionInfo; if (fileVersion != null) { ushort major = fileVersion.ProductVersionMajor; ushort minor = fileVersion.ProductVersionMinor; ushort build = fileVersion.ProductVersionBuild; ushort revision = fileVersion.ProductVersionRevision; var hostArchitectures = new List <string>(); string targetArchitecture = null; ImageFileMachine machine = (ImageFileMachine)_peFile.FileHeader.Machine; switch (machine) { case ImageFileMachine.Amd64: targetArchitecture = "amd64"; break; case ImageFileMachine.I386: targetArchitecture = "x86"; break; case ImageFileMachine.ArmNT: targetArchitecture = "arm"; hostArchitectures.Add("x86"); break; case ImageFileMachine.Arm64: targetArchitecture = "arm64"; hostArchitectures.Add("amd64"); break; } if (targetArchitecture != null) { hostArchitectures.Add(targetArchitecture); foreach (string hostArchitecture in hostArchitectures) { string buildFlavor = ""; if ((fileVersion.FileFlags & FileInfoFlags.Debug) != 0) { if ((fileVersion.FileFlags & FileInfoFlags.SpecialBuild) != 0) { buildFlavor = ".dbg"; } else { buildFlavor = ".chk"; } } foreach (string name in s_longNameBinaryPrefixes) { // The name prefixes include the trailing "_". string longName = string.Format("{0}{1}_{2}_{3}.{4}.{5}.{6:00}{7}.dll", name, hostArchitecture, targetArchitecture, major, minor, build, revision, buildFlavor); specialFiles.Add(longName); } } } } else { Tracer.Warning("{0} has no version resource", _path); } return(specialFiles); }
/// <summary> /// Convert from symstore VsFixedFileInfo to DebugServices VersionData /// </summary> public static VersionData ToVersionData(this VsFixedFileInfo fileInfo) { return(new VersionData(fileInfo.FileVersionMajor, fileInfo.FileVersionMinor, fileInfo.FileVersionRevision, fileInfo.FileVersionBuild)); }
/// <summary> /// Creates a default Windows VS_FIXEDFILEINFO structure. /// </summary> /// <returns>A default Windows VS_FIXEDFILEINFO.</returns> public static VsFixedFileInfo GetWindowsDefault() { VsFixedFileInfo fixedFileInfo = new VsFixedFileInfo(); fixedFileInfo.Signature = ResourceWinVer.VS_FFI_SIGNATURE; fixedFileInfo.StrucVersion = ResourceWinVer.VS_FFI_STRUCVERSION; fixedFileInfo.FileFlagsMask = ResourceWinVer.VS_FFI_FILEFLAGSMASK; fixedFileInfo.FileOs = (uint)ResourceWinVer.FileOs.VOS__WINDOWS32; fixedFileInfo.FileSubtyp = (uint)ResourceWinVer.FileSubType.VFT2_UNKNOWN; fixedFileInfo.FileTyp = (uint)ResourceWinVer.FileType.VFT_DLL; return fixedFileInfo; }