示例#1
0
 private void FetchExternalAssemblies()
 {
     foreach (ToLoadAssembly ass in toLoadAssemblies)
     {
         var assembly        = ass.Assembly;
         var name            = assembly.GetName().Name.SanitizAssembly();
         var classesRefferal = assembly.DefinedTypes.Where(x => !x.IsInterface && x.IsPublic && !x.IsAbstract && x.Name == "PluginRefferal");
         if (classesRefferal.Any())
         {
             var PluginRefferal = (IPluginRefferal)classesRefferal.First().GetConstructors().First().Invoke(new object[] { });
             var AssemblyEntity = new AssemblyEntity()
             {
                 Assembly       = assembly,
                 Context        = ass.AssemblyContext,
                 Module         = new List <ModuleInfo>(),
                 Name           = name,
                 pluginRefferal = PluginRefferal
             };
             if (RuntimeAssemblies.AssemblyEntities.Any(x => x.Value.Name == name))
             {
                 continue;
             }
             RuntimeAssemblies.AssemblyEntities.TryAdd(name, AssemblyEntity);
             _logging.Log(LogSeverity.Info, $"Loaded {name} v{ass.Assembly.GetName().Version} assembly modules.");
             if (!RuntimeAssemblies.AssemblyEntities.Any())
             {
                 break;
             }
         }
     }
 }
示例#2
0
 /// <summary>
 /// Произвести обработку типов.
 /// </summary>
 /// <param name="assemblyEntity">Сущность сборки для типов.</param>
 /// <param name="types">Типы, обработку которых необходимо произвести.</param>
 private void ProcessTypes(AssemblyEntity assemblyEntity, IEnumerable <Type> types)
 {
     foreach (Type type in types)
     {
         ProcessType(assemblyEntity, type);
     }
 }
示例#3
0
 /// <summary>
 /// Произвести обработку членов типа.
 /// </summary>
 /// <param name="assemblyEntity">Сущность сборки для типа.</param>
 /// <param name="memberInfos">Метаданные.</param>
 private void ProcessMembers(AssemblyEntity assemblyEntity, IEnumerable <MemberInfo> memberInfos)
 {
     foreach (MemberInfo memberInfo in memberInfos)
     {
         ProcessMember(assemblyEntity, memberInfo);
     }
 }
        /// <summary>
        /// Получить существующую информацию о содержимом сборки, либо добавить ее в БД.
        /// </summary>
        /// <param name="assemblyEntity">Сущность сборки, для которой необходимо получить информацию.</param>
        /// <param name="memberInfo">Метаданные содержимого сборки по которым нужно искать информацию.</param>
        /// <returns>Сущнось содержимого сборки.</returns>
        private AssemblyMemberEntity GetAssemblyMemberEntity(AssemblyEntity assemblyEntity, MemberInfo memberInfo)
        {
            AssemblyMemberEntity memberEntity = _context.Members.FirstOrDefault(a => a.MemberType == memberInfo.MemberType && a.Name == memberInfo.Name && a.AssemblyId == assemblyEntity.Id);
            if (memberEntity == null)
            {
                memberEntity = new AssemblyMemberEntity(assemblyEntity, memberInfo);
                _context.Members.Add(memberEntity);
            }

            return memberEntity;
        }
        /// <summary>
        /// Получить существующую информацию о сборке, либо добавить ее в БД.
        /// </summary>
        /// <param name="assembly">Сборка.</param>
        /// <returns>Сущность сборки.</returns>
        private AssemblyEntity GetAssemblyEntity(Assembly assembly)
        {
            AssemblyEntity assemblyEntity = _context.Assemblies.FirstOrDefault(a => a.Name == assembly.FullName);
            if (assemblyEntity == null)
            {
                assemblyEntity = new AssemblyEntity(assembly);
                _context.Assemblies.Add(assemblyEntity);
            }

            return assemblyEntity;
        }
示例#6
0
        /// <summary>
        /// Получить существующую информацию о содержимом сборки, либо добавить ее в БД.
        /// </summary>
        /// <param name="assemblyEntity">Сущность сборки, для которой необходимо получить информацию.</param>
        /// <param name="memberInfo">Метаданные содержимого сборки по которым нужно искать информацию.</param>
        /// <returns>Сущнось содержимого сборки.</returns>
        private AssemblyMemberEntity GetAssemblyMemberEntity(AssemblyEntity assemblyEntity, MemberInfo memberInfo)
        {
            AssemblyMemberEntity memberEntity = _context.Members.FirstOrDefault(a => a.MemberType == memberInfo.MemberType && a.Name == memberInfo.Name && a.AssemblyId == assemblyEntity.Id);

            if (memberEntity == null)
            {
                memberEntity = new AssemblyMemberEntity(assemblyEntity, memberInfo);
                _context.Members.Add(memberEntity);
            }

            return(memberEntity);
        }
示例#7
0
        /// <summary>
        /// Получить существующую информацию о сборке, либо добавить ее в БД.
        /// </summary>
        /// <param name="assembly">Сборка.</param>
        /// <returns>Сущность сборки.</returns>
        private AssemblyEntity GetAssemblyEntity(Assembly assembly)
        {
            AssemblyEntity assemblyEntity = _context.Assemblies.FirstOrDefault(a => a.Name == assembly.FullName);

            if (assemblyEntity == null)
            {
                assemblyEntity = new AssemblyEntity(assembly);
                _context.Assemblies.Add(assemblyEntity);
            }

            return(assemblyEntity);
        }
示例#8
0
        /// <summary>
        /// Извлечь историю (аннотации) из сборки.
        /// </summary>
        /// <param name="assembly">Сборка.</param>
        public void ExtractFromAssembly(Assembly assembly)
        {
            // Получим сборку.
            AssemblyEntity assemblyEntity = GetAssemblyEntity(assembly);

            // Извлечем все типы сборки.
            var assemblyTypes = assembly.GetTypes();

            // Обработаем классы сборки.
            ProcessTypes(assemblyEntity, assemblyTypes.Where(a => a.IsClass));

            // Возможность обрабатывать интерфейсы.
            //ProcessTypes(_context, assemblyEntity, assemblyTypes.Where(a=>a.IsInterface));
        }
示例#9
0
        /// <summary>
        /// Произвести обработку одного члена типа.
        /// </summary>
        /// <param name="assemblyEntity">Сущность сборки для типа.</param>
        /// <param name="memberInfo">Метаданные.</param>
        private void ProcessMember(AssemblyEntity assemblyEntity, MemberInfo memberInfo)
        {
            var historyAttributes = memberInfo.GetCustomAttributes <HistoryAttribute>().ToList();

            if (historyAttributes.Any())
            {
                AssemblyMemberEntity memberEntity = GetAssemblyMemberEntity(assemblyEntity, memberInfo);

                foreach (HistoryAttribute historyAttribute in historyAttributes)
                {
                    GetMemberAnnotationEntity(memberEntity, historyAttribute);
                }
            }
        }
示例#10
0
        /// <summary>
        /// Произвести обработку одного типа.
        /// </summary>
        /// <param name="assemblyEntity">Сущность сборки для указанного типа.</param>
        /// <param name="type">Тип, обработку которого необходимо произвести.</param>
        private void ProcessType(AssemblyEntity assemblyEntity, Type type)
        {
            // Типы тоже являются наследниками MemberInfo, поэтому извлечение истории можно выполнять единообразно как для членов типов, так и для самих типов.
            ProcessMember(assemblyEntity, type);

            // Извлечем члены типа.
            var members = type.GetMembers();

            // Обработаем методы.
            ProcessMembers(assemblyEntity, members.Where(a => a.MemberType == MemberTypes.Method));

            // Возможность обработки свойств.
            //ProcessMembers(assemblyEntity, members.Where(a => a.MemberType == MemberTypes.Property));

            // Возможность обработки полей.
            //ProcessMembers(assemblyEntity, members.Where(a => a.MemberType == MemberTypes.Field));

            // И т.д.
        }
 /// <summary>
 /// Произвести обработку типов.
 /// </summary>
 /// <param name="assemblyEntity">Сущность сборки для типов.</param>
 /// <param name="types">Типы, обработку которых необходимо произвести.</param>
 private void ProcessTypes(AssemblyEntity assemblyEntity, IEnumerable<Type> types)
 {
     foreach (Type type in types)
     {
         ProcessType(assemblyEntity, type);
     }
 }
        /// <summary>
        /// Произвести обработку одного типа.
        /// </summary>
        /// <param name="assemblyEntity">Сущность сборки для указанного типа.</param>
        /// <param name="type">Тип, обработку которого необходимо произвести.</param>
        private void ProcessType(AssemblyEntity assemblyEntity, Type type)
        {
            // Типы тоже являются наследниками MemberInfo, поэтому извлечение истории можно выполнять единообразно как для членов типов, так и для самих типов.
            ProcessMember(assemblyEntity, type);

            // Извлечем члены типа.
            var members = type.GetMembers();

            // Обработаем методы.
            ProcessMembers(assemblyEntity, members.Where(a => a.MemberType == MemberTypes.Method));

            // Возможность обработки свойств.
            //ProcessMembers(assemblyEntity, members.Where(a => a.MemberType == MemberTypes.Property));

            // Возможность обработки полей.
            //ProcessMembers(assemblyEntity, members.Where(a => a.MemberType == MemberTypes.Field));

            // И т.д.
        }
 /// <summary>
 /// Произвести обработку членов типа.
 /// </summary>
 /// <param name="assemblyEntity">Сущность сборки для типа.</param>
 /// <param name="memberInfos">Метаданные.</param>
 private void ProcessMembers(AssemblyEntity assemblyEntity, IEnumerable<MemberInfo> memberInfos)
 {
     foreach (MemberInfo memberInfo in memberInfos)
     {
         ProcessMember(assemblyEntity, memberInfo);
     }
 }
        /// <summary>
        /// Произвести обработку одного члена типа.
        /// </summary>
        /// <param name="assemblyEntity">Сущность сборки для типа.</param>
        /// <param name="memberInfo">Метаданные.</param>
        private void ProcessMember(AssemblyEntity assemblyEntity, MemberInfo memberInfo)
        {
            var historyAttributes = memberInfo.GetCustomAttributes<HistoryAttribute>().ToList();
            if (historyAttributes.Any())
            {
                AssemblyMemberEntity memberEntity = GetAssemblyMemberEntity(assemblyEntity, memberInfo);

                foreach (HistoryAttribute historyAttribute in historyAttributes)
                {
                    GetMemberAnnotationEntity(memberEntity, historyAttribute);
                }
            }
        }