File: WebcilReader.Reflection.cs
Web Access
Project: src\src\tasks\Microsoft.NET.WebAssembly.Webcil\Microsoft.NET.WebAssembly.Webcil.csproj (Microsoft.NET.WebAssembly.Webcil)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Immutable;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
 
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
 
namespace Microsoft.NET.WebAssembly.Webcil;
 
 
public sealed partial class WebcilReader
{
 
    // Helpers to call into System.Reflection.Metadata internals
    internal static class Reflection
    {
        private static readonly Lazy<MethodInfo> s_readUtf8NullTerminated = new Lazy<MethodInfo>(() =>
        {
            var mi = typeof(BlobReader).GetMethod("ReadUtf8NullTerminated", BindingFlags.NonPublic | BindingFlags.Instance);
            if (mi == null)
            {
                throw new InvalidOperationException("Could not find BlobReader.ReadUtf8NullTerminated");
            }
            return mi;
        });
 
        internal static string? ReadUtf8NullTerminated(ref BlobReader reader)
        {
            object boxedReader = reader;
            string? result = (string?)s_readUtf8NullTerminated.Value.Invoke(boxedReader, null);
            reader = (BlobReader) boxedReader; // the call modifies the struct state, make sure to copy it back.
            return result;
        }
 
        private static readonly Lazy<ConstructorInfo> s_codeViewDebugDirectoryDataCtor = new Lazy<ConstructorInfo>(() =>
        {
            var types = new Type[] { typeof(Guid), typeof(int), typeof(string) };
            var mi = typeof(CodeViewDebugDirectoryData).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, types, null);
            if (mi == null)
            {
                throw new InvalidOperationException("Could not find CodeViewDebugDirectoryData constructor");
            }
            return mi;
        });
 
        internal static CodeViewDebugDirectoryData MakeCodeViewDebugDirectoryData(Guid guid, int age, string path) => (CodeViewDebugDirectoryData)s_codeViewDebugDirectoryDataCtor.Value.Invoke(new object[] { guid, age, path });
 
        private static readonly Lazy<ConstructorInfo> s_pdbChecksumDebugDirectoryDataCtor = new Lazy<ConstructorInfo>(() =>
        {
            var types = new Type[] { typeof(string), typeof(ImmutableArray<byte>) };
            var mi = typeof(PdbChecksumDebugDirectoryData).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, types, null);
            if (mi == null)
            {
                throw new InvalidOperationException("Could not find PdbChecksumDebugDirectoryData constructor");
            }
            return mi;
        });
        internal static PdbChecksumDebugDirectoryData MakePdbChecksumDebugDirectoryData(string algorithmName, ImmutableArray<byte> checksum) => (PdbChecksumDebugDirectoryData)s_pdbChecksumDebugDirectoryDataCtor.Value.Invoke(new object[] { algorithmName, checksum });
    }
}