From 2144946572e29e6208aba8e716a00e2226c37608 Mon Sep 17 00:00:00 2001 From: Tomas Matousek Date: Tue, 25 Mar 2025 18:43:46 -0700 Subject: [PATCH] Fix reading GUIDs from delta metadata --- .../MetadataVisualizer.cs | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Metadata.Visualizer/MetadataVisualizer.cs b/src/Microsoft.Metadata.Visualizer/MetadataVisualizer.cs index a81842e..244fc49 100644 --- a/src/Microsoft.Metadata.Visualizer/MetadataVisualizer.cs +++ b/src/Microsoft.Metadata.Visualizer/MetadataVisualizer.cs @@ -938,12 +938,41 @@ private string Literal(Handle handle, Func getVa if (_aggregator != null) { - Handle generationHandle = _aggregator.GetGenerationHandle(handle, out int generation); + Handle generationHandle; + int generation; + + // workaround for https://github.com/dotnet/runtime/issues/113910 + if (handle.Kind == HandleKind.Guid) + { + generationHandle = handle; + generation = -1; + + var guidOffset = MetadataTokens.GetHeapOffset(handle); + + for (int i = 0; i < _readers.Count; i++) + { + if (guidOffset <= _readers[i].GetHeapSize(HeapIndex.Guid) / 16) + { + generation = i; + break; + } + } + + if (generation < 0) + { + return BadMetadataStr; + } + } + else + { + generationHandle = _aggregator.GetGenerationHandle(handle, out generation); + } var generationReader = _readers[generation]; + var offset = generationReader.GetHeapOffset(handle); + var generationOffset = generationReader.GetHeapOffset(generationHandle); + string value = GetValueChecked(getValue, generationReader, generationHandle); - int offset = generationReader.GetHeapOffset(handle); - int generationOffset = generationReader.GetHeapOffset(generationHandle); if (noHeapReferences) {