public void AddListener(ListenerBase impl) { impl.OnAccept += (l, inStream, outStream) => { Enroll(inStream, outStream); }; Implementations.Add(impl); }
private void fillImplementations(List <Assembly> assemblies) { assemblies .ForEach(assembly => { assembly .GetTypes() .ToList() .Where(className => className.GetInterfaces() .Contains(DependencyType) && className.IsClass && !className.Namespace.Contains("System") ) .ToList() .ForEach(x => Implementations.Add(new Dependency(x, assemblies))); }); }
/// <summary> /// Извлечь все алгоритмы решения из предоставленной DLL. /// </summary> /// <param name="file">Ссылка на выбранный DLL файл.</param> /// <exception cref="NoImplementationException">В предоставленной DLL не было ни одного алгоритма решения</exception> /// <exception cref="BadImageFormatException">Выбранный файл не является DLL или собран с более новой версией среды выполнения</exception> public async Task AddFromFile(IFileReference file) { var addedImplementations = 0; await using (var stream = await file.CreateMemoryStreamAsync()) { var bytes = stream.ToArray(); var assembly = Assembly.Load(bytes); var solverTypes = assembly .GetExportedTypes() .Where(t => typeof(ISolver).IsAssignableFrom(t)) .ToList(); foreach (var type in solverTypes) { ISolver solver; try { solver = (ISolver)Activator.CreateInstance(type); } catch { continue; } if (solver != null) { Implementations.Add(solver); addedImplementations++; } } } if (addedImplementations == 0) { throw new NoImplementationException(); } ImplementationAdded?.Invoke(); }