TeamCity.CSharpInteractive/ReferencesScriptOptionsFactory.cs (43 lines of code) (raw):

// ReSharper disable ClassNeverInstantiated.Global namespace TeamCity.CSharpInteractive; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Scripting; internal class ReferencesScriptOptionsFactory : IScriptOptionsFactory, IReferenceRegistry { private readonly ILog<ReferencesScriptOptionsFactory> _log; private readonly IRuntimeExplorer _runtimeExplorer; private readonly HashSet<PortableExecutableReference> _references = new(); public ReferencesScriptOptionsFactory( ILog<ReferencesScriptOptionsFactory> log, IRuntimeExplorer runtimeExplorer) { _log = log; _runtimeExplorer = runtimeExplorer; } public ScriptOptions Create(ScriptOptions baseOptions) => baseOptions.AddReferences(_references); public bool TryRegisterAssembly(string assemblyPath, out string description) { try { assemblyPath = Path.GetFullPath(assemblyPath); if (_runtimeExplorer.TryFindRuntimeAssembly(assemblyPath, out var runtimeAssemblyPath)) { AddRef(runtimeAssemblyPath, out description); } AddRef(assemblyPath, out description); return true; } catch (Exception ex) { description = ex.Message; } return false; } private void AddRef(string fileName, out string description) { _log.Trace(() => new[] {new Text($"Try register the assembly \"{fileName}\".")}); var reference = MetadataReference.CreateFromFile(fileName); description = reference.Display ?? string.Empty; _references.Add(reference); _log.Trace(() => new[] {new Text($"New metadata reference added \"{reference.Display}\".")}); } }