File: TLens\AssemlyReferenceResolver.cs
Web Access
Project: src\src\runtime\src\tools\illink\src\tlens\tlens.csproj (tlens)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;
using System.Collections.Generic;
using System.IO;
using Mono.Cecil;

namespace TLens
{
    sealed class AssemlyReferenceResolver : IAssemblyResolver
    {
        readonly string[] additionalFolders;
        readonly Dictionary<string, AssemblyDefinition> resolved = new();

        public AssemlyReferenceResolver(string[] additionalFolders)
        {
            this.additionalFolders = additionalFolders;
            ReaderParameters = new ReaderParameters(ReadingMode.Deferred)
            {
                AssemblyResolver = this
            };
        }

        public ReaderParameters ReaderParameters { get; }

        public void Dispose()
        {
        }

        public AssemblyDefinition Resolve(AssemblyNameReference name)
        {
            if (resolved.TryGetValue(name.Name, out AssemblyDefinition assembly))
                return assembly;

            string fileName = name.Name + ".dll";

            foreach (var folder in additionalFolders)
            {
                string file = Path.Combine(folder, fileName);
                if (File.Exists(file))
                {
                    assembly = AssemblyDefinition.ReadAssembly(file, ReaderParameters);
                    if (assembly != null)
                    {
                        resolved.Add(name.Name, assembly);
                        return assembly;
                    }
                }
            }

            Console.WriteLine($"The file for assembly reference '{name.Name}' could not be located.");
            return null;
        }

        public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
        {
            throw new NotImplementedException();
        }
    }
}