There is very subtle bug in the Windows PDB key generator that caused the pdb checksum list never to be passed to the SymbolStoreKey constructor (one of the closing parentheses is in the wrong place causing pdbChecksums to be passed to the string.Format instead of BuildKey).
- return BuildKey(path, string.Format("{0}{1:x}", signature.ToString("N"), age, pdbChecksums));
+ return BuildKey(path, string.Format("{0}{1:x}", signature.ToString("N"), age), clrSpecialFile: false, pdbChecksums);
Once this was fixed, symbol downloads for Windows PDBs (i.e. Microsoft.Extensions.Hosting.Abstractions.ni.pdb) started failing because ChecksumValidator.cs seems to only handle portable PDBs:
private static uint GetPdbStreamOffset(Stream pdbStream)
{
pdbStream.Position = 0;
using (var reader = new BinaryReader(pdbStream, Encoding.UTF8, leaveOpen: true))
{
pdbStream.Seek(4 + // Signature
2 + // Version Major
2 + // Version Minor
4, // Reserved)
SeekOrigin.Begin);
// skip the version string
uint versionStringSize = reader.ReadUInt32(); <<------- exception
pdbStream.Seek(versionStringSize, SeekOrigin.Current);