/// <summary> /// Unpacks all files stored in a PortablePDB meta-data. The key in the dictionary is the location of a source file /// on the build machine. The value is the content of the source file itself. /// The function will throw an exception if PortablePDB file is not found or anything else went wrong. /// </summary> /// <param name="pdbFilePath">Path to PortablePDB file to load source files from.</param> public static Dictionary <string, CompressedSourceFile> GetEmbeddedFiles(string pdbFilePath) { Dictionary <string, CompressedSourceFile> embeddedFiles = new Dictionary <string, CompressedSourceFile>(); using (FileStream stream = File.OpenRead(pdbFilePath)) using (MetadataReaderProvider metadataReaderProvider = MetadataReaderProvider.FromPortablePdbStream(stream)) { MetadataReader metadataReader = metadataReaderProvider.GetMetadataReader(); CustomDebugInformationHandleCollection customDebugInformationHandles = metadataReader.CustomDebugInformation; foreach (var customDebugInformationHandle in customDebugInformationHandles) { CustomDebugInformation customDebugInformation = metadataReader.GetCustomDebugInformation(customDebugInformationHandle); if (metadataReader.GetGuid(customDebugInformation.Kind) == EmbeddedSource) { byte[] embeddedSource = metadataReader.GetBlobBytes(customDebugInformation.Value); Int32 uncompressedSourceFileSize = BitConverter.ToInt32(embeddedSource, 0); if (uncompressedSourceFileSize != 0) { Document document = metadataReader.GetDocument((DocumentHandle)customDebugInformation.Parent); string sourceFileName = System.IO.Path.GetFullPath(metadataReader.GetString(document.Name)); embeddedFiles.Add(sourceFileName, new CompressedSourceFile(embeddedSource)); } } } } return(embeddedFiles); }
/// <summary> /// Returns SourceLink information, that is the source link information as described at https://github.com/dotnet/designs/blob/master/accepted/diagnostics/source-link.md#source-link-json-schema /// stored in PortablePDB. /// The function will throw an exception if PortablePDB file is not found or anything else went wrong. /// </summary> /// <param name="pdbFilePath">Path to PortablePDB file </param> public static SourceLinkInfo GetSourceLinkInfo(string pdbFilePath) { using (FileStream stream = File.OpenRead(pdbFilePath)) { using (MetadataReaderProvider metadataReaderProvider = MetadataReaderProvider.FromPortablePdbStream(stream)) { MetadataReader metadataReader = metadataReaderProvider.GetMetadataReader(); CustomDebugInformationHandleCollection customDebugInformationHandles = metadataReader.CustomDebugInformation; foreach (var customDebugInformationHandle in customDebugInformationHandles) { CustomDebugInformation customDebugInformation = metadataReader.GetCustomDebugInformation(customDebugInformationHandle); if (metadataReader.GetGuid(customDebugInformation.Kind) == SourceLink) { string jsonString = Encoding.UTF8.GetString(metadataReader.GetBlobBytes(customDebugInformation.Value)); return(Newtonsoft.Json.JsonConvert.DeserializeObject <SourceLinkInfo>(jsonString)); } } } } return(null); }