示例#1
0
 public void AddListener(ListenerBase impl)
 {
     impl.OnAccept += (l, inStream, outStream) =>
     {
         Enroll(inStream, outStream);
     };
     Implementations.Add(impl);
 }
示例#2
0
 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();
        }