Exemplo n.º 1
0
        /// <summary>
        /// COMオブジェクトリスト内のすべてのオブジェクトの参照を解放する。
        /// </summary>
        /// <param name="list">COMオブジェクトリスト</param>
        /// <param name="reverse">逆順解放を行うか否か</param>
        public static void ReleaseAllComObject(ObjectList list, bool reverse = true)
        {
            var items = reverse ? list.AsEnumerable().Reverse() : list;

            foreach (var obj in items)
            {
                ReleaseExistComObject(obj);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Инициализация пула объектов с указанием режима инициализации списка объектов (ленивая или в конструкторе).
        /// </summary>
        /// <param name="isLazyInitialization">Указывает, как именно следует инициализировать список объектов - во время первого обращения к <see cref="ObjectList"/> (true) или непосредственно в конструкторе (false).</param>
        public ObjectPool(bool isLazyInitialization = true)
        {
            AppDomain.CurrentDomain.AssemblyLoad += UpdateObjectsListOnAssemblyLoad;

            _objects = new Lazy <List <TPoolObject> >(() =>
            {
                var objectsList = new List <TPoolObject>();
                if (typeof(TPoolObject) == typeof(IPoolObject))
                {
                    throw new ArgumentException($"Параметр-тип {nameof(TPoolObject)} не должен совпадать с базовым типом {typeof(IPoolObject).FullName}, должен быть наследником.");
                }
                if (!typeof(TPoolObject).IsInterface)
                {
                    throw new ArgumentException($"Параметр-тип {nameof(TPoolObject)} должен быть интерфейсом.");
                }

                var types = GetObjectsTypesList();
                foreach (var type in types)
                {
                    try
                    {
                        var handled = false;
                        var onCreateFactoryMethod = typeof(ObjectPool <>).GetMethod(nameof(OnCreatePoolObject), System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic, null, new Type[] { typeof(bool) }, null);
                        TPoolObject obj           = null;
                        if (onCreateFactoryMethod != null)
                        {
                            onCreateFactoryMethod = onCreateFactoryMethod.MakeGenericMethod(type);
                            obj = onCreateFactoryMethod.Invoke(this, new object[] { handled }) as TPoolObject;
                        }

                        if (!handled)
                        {
                            var openConstructor = type.GetConstructor(new Type[] { });
                            if (openConstructor != null)
                            {
                                obj = Activator.CreateInstance(type) as TPoolObject;
                            }
                        }

                        if (obj != null)
                        {
                            if (obj is IPoolObjectInit)
                            {
                                (obj as IPoolObjectInit).Init();
                            }
                            objectsList.Add(obj);
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("{0}: provider '{1}' init error: {2}", this.GetType().FullName, type.FullName, ex.Message);
                    }
                }

                OnUpdateObjectsList(objectsList);
                return(objectsList);
            }, true);

            OnInit();

            if (!isLazyInitialization)
            {
                var f = ObjectList.AsEnumerable().ToList();
            }
        }