using System; using System.Collections.Generic; using System.Reflection; using System.Threading; using AspClassic.Scripting.Utils; namespace AspClassic.Scripting.Runtime; public sealed class ScriptDomainManager { private readonly DynamicRuntimeHostingProvider _hostingProvider; private readonly SharedIO _sharedIO; private List _loadedAssemblies = new List(); private int _lastContextId; private Scope _globals; private readonly DlrConfiguration _configuration; public PlatformAdaptationLayer Platform { get { PlatformAdaptationLayer platformAdaptationLayer = _hostingProvider.PlatformAdaptationLayer; if (platformAdaptationLayer == null) { throw new InvalidImplementationException(); } return platformAdaptationLayer; } } public SharedIO SharedIO => _sharedIO; public DynamicRuntimeHostingProvider Host => _hostingProvider; public DlrConfiguration Configuration => _configuration; public Scope Globals { get { return _globals; } set { _globals = value; } } public event EventHandler AssemblyLoaded; public ScriptDomainManager(DynamicRuntimeHostingProvider hostingProvider, DlrConfiguration configuration) { ContractUtils.RequiresNotNull(hostingProvider, "hostingProvider"); ContractUtils.RequiresNotNull(configuration, "configuration"); configuration.Freeze(); _hostingProvider = hostingProvider; _configuration = configuration; _sharedIO = new SharedIO(); _globals = new Scope(); } internal ContextId GenerateContextId() { return new ContextId(Interlocked.Increment(ref _lastContextId)); } public LanguageContext GetLanguage(Type providerType) { ContractUtils.RequiresNotNull(providerType, "providerType"); return GetLanguageByTypeName(providerType.AssemblyQualifiedName); } public LanguageContext GetLanguageByTypeName(string providerAssemblyQualifiedTypeName) { ContractUtils.RequiresNotNull(providerAssemblyQualifiedTypeName, "providerAssemblyQualifiedTypeName"); AssemblyQualifiedTypeName providerName = AssemblyQualifiedTypeName.ParseArgument(providerAssemblyQualifiedTypeName, "providerAssemblyQualifiedTypeName"); if (!_configuration.TryLoadLanguage(this, providerName, out var language)) { throw Error.UnknownLanguageProviderType(); } return language; } public bool TryGetLanguage(string languageName, out LanguageContext language) { ContractUtils.RequiresNotNull(languageName, "languageName"); return _configuration.TryLoadLanguage(this, languageName, isExtension: false, out language); } public LanguageContext GetLanguageByName(string languageName) { if (!TryGetLanguage(languageName, out var language)) { throw new ArgumentException($"Unknown language name: '{languageName}'"); } return language; } public bool TryGetLanguageByFileExtension(string fileExtension, out LanguageContext language) { ContractUtils.RequiresNotEmpty(fileExtension, "fileExtension"); return _configuration.TryLoadLanguage(this, DlrConfiguration.NormalizeExtension(fileExtension), isExtension: true, out language); } public LanguageContext GetLanguageByExtension(string fileExtension) { if (!TryGetLanguageByFileExtension(fileExtension, out var language)) { throw new ArgumentException($"Unknown file extension: '{fileExtension}'"); } return language; } public bool LoadAssembly(Assembly assembly) { ContractUtils.RequiresNotNull(assembly, "assembly"); lock (_loadedAssemblies) { if (_loadedAssemblies.Contains(assembly)) { return false; } _loadedAssemblies.Add(assembly); } this.AssemblyLoaded?.Invoke(this, new AssemblyLoadedEventArgs(assembly)); return true; } public IList GetLoadedAssemblyList() { lock (_loadedAssemblies) { return _loadedAssemblies.ToArray(); } } }