예제 #1
0
        /// <summary>
        /// InstanceProxy를 생성합니다.
        /// </summary>
        /// <param name="assemblyProxy"></param>
        /// <param name="classType">ClassTypeFullName</param>
        public InstanceProxy(AssemblyProxy assemblyProxy, string classType)
        {
            try
            {
                //실제 수행객체를 생성
                _instanceImpl = InstanceCore.Create(assemblyProxy, classType);

                //카운터 설정
                _assemblyRefCounter   = assemblyProxy.RefCounter;
                _methodInvokerCounter = new RefCounter(classType);

                //참조 카운터 1회 증가 및 하위카운터 등록
                _assemblyRefCounter.IncrementRefCounter();
                _assemblyRefCounter += _methodInvokerCounter;

                //AssemblyUnload 이벤트 연결
                assemblyProxy.EventUnload += HandlerAssemblyProxyEventUnload;

                //모든과정이 통과되면 유효 객체
                _isValid        = true;
                _wasCallDispose = false;
            }
            catch (Exception e)
            {
                _isValid        = false;
                _wasCallDispose = false;
                throw e;
            }
        }
예제 #2
0
        /// <summary>
        /// 자원을 해제 합니다.
        /// </summary>
        /// <param name="releaseAll">관리자원 포함 여부</param>
        protected void Dispose(bool releaseAll)
        {
            if (_wasCallDispose == true)
            {
                return;
            }
            else
            {
                _wasCallDispose = true;
            }

            //관리자원 해제
            if (releaseAll == true)
            {
                ReleaseManagementResource();
            }

            //비관리자원 해제
            //TODO


            //마무리
            _isValid = false;
            _assemblyRefCounter.DecrementRefCounter();
            _assemblyRefCounter  -= _methodInvokerCounter;
            _assemblyRefCounter   = null;
            _methodInvokerCounter = null;

            //생성된 MethodInvoker들에게 통지 및 자원해제
            if (EventInvalidProxy != null)
            {
                EventInvalidProxy(this, null);
                EventInvalidProxy = null;
            }
        }
예제 #3
0
 internal TESTINVOKER(MethodInvokerCore core,
                      RefCounter instanceRefCounter,
                      object[] args) :
     base(core, instanceRefCounter, null)
 {
     OKOK = true;
 }
예제 #4
0
        /// <summary>
        /// 전달 값에 따른 리소스를 해제 합니다.
        /// </summary>
        /// <param name="releaseAll">관리형 리소스를 포함 합니다.</param>
        protected void Dispose(bool releaseAll)
        {
            if (_wasCallDispose == true)
            {
                return;
            }
            else
            {
                _wasCallDispose = true;
            }

            //관리형 리소스를 해제 한다.
            if (releaseAll == true)
            {
                ReleaseManagementResource();
            }

            //비관리형 리소스 해제
            //TODO


            //마무리
            _isValid = false;
            _instanceRefCounter.DecrementRefCounter();
            _instanceRefCounter = null;

            //비유효화 통지
            if (EventInvalidInvoker != null)
            {
                EventInvalidInvoker(this, null);
            }
        }
예제 #5
0
 /// <summary>
 /// 내부 필드를 초기화하는 기본 생성자
 /// </summary>
 private MethodInvoker()
 {
     _core = null;
     _instanceRefCounter = null;
     _isValid            = false;
     _wasCallDispose     = false;
     EventInvalidInvoker = null;
 }
예제 #6
0
        public void RegisterSubCounter(RefCounter subCounter)
        {
            if (_subCounters != null)
            {
                _subCounters.Add(subCounter);

                //부모 카운터 설정
                subCounter._parent = this;
            }
        }
예제 #7
0
 public bool UnregisterSubCounter(RefCounter subCounter)
 {
     if (_subCounters != null)
     {
         subCounter._parent = null;
         return(_subCounters.Remove(subCounter));
     }
     else
     {
         return(false);
     }
 }
예제 #8
0
        /// <summary>
        /// 카운트 값이 0이면 ZeroCount이벤트를 발생시킨다.
        /// DecrementCount가 발생할 떄 마다 호출 된다.
        /// </summary>
        private void HandlerCountZero(object sender, object e)
        {
            RefCounter refCounter = (RefCounter)sender;

            if (refCounter.Count == 0)
            {
                if (EventZeroCount != null)
                {
                    EventZeroCount(this, e);
                }
            }
        }
예제 #9
0
        /// <summary>
        /// 참조 횟수 카운터를 생성합니다.
        /// </summary>
        /// <param name="initCount">초기 값</param>
        public RefCounter(string name = "Undefined", int initCount = 0)
        {
            //필드 초기화
            _count  = initCount;
            _name   = name;
            _parent = null;

            //서브 카운터 목록
            _subCounters = new List <RefCounter>();

            //이벤트
            EventZeroCount = null;

            //CountZero 이벤트를 생성한다.
            EventDecrementCount += HandlerCountZero;
        }
예제 #10
0
        /// <summary>
        /// MethodInvoker를 생성합니다.
        /// </summary>
        /// <param name="core">MethodCore</param>
        /// <param name="instanceRefCounter">InstaceProxy의 Method Counter</param>
        /// <param name="args">기타 변수. 기본 Invoker에서는 사용되지 않습니다.</param>
        internal MethodInvoker(MethodInvokerCore core,
                               RefCounter instanceRefCounter,
                               object[] args)
            : this()
        {
            if (core == null || instanceRefCounter == null)
            {
                _isValid = false;
                throw new ArgumentNullException("core or instanceRefCounter는 null값이 될 수 없습니다.");
            }

            //코어
            _core = core;

            //참조 횟수 증가
            _instanceRefCounter = instanceRefCounter;
            _instanceRefCounter.IncrementRefCounter();

            //유효함
            _isValid = true;
        }
예제 #11
0
        /// <summary>
        /// 어셈블리 파일로 부터 로드 합니다.
        /// </summary>
        /// <param name="domainName"></param>
        /// <param name="assemblyFilePath"></param>
        public AssemblyProxy(string domainName, string assemblyFilePath)
            : this()
        {
            if (domainName == null || domainName == string.Empty)
            {
                throw new ArgumentException("domainName은 null or empty값이 될 수 없습니다.");
            }

            try
            {
                _refCounter          = new RefCounter(domainName);
                _targetAppDomain     = CreateAppDomainFromEnv(domainName);
                _assemblyProxyLoader = AssemblyProxyLoader.CreateLoaderAndLoadFormFile(_targetAppDomain, assemblyFilePath);
                _isVaild             = true;
            }
            catch (Exception e)
            {
                _isVaild = false;
                throw new Exception("AssemblyProxy 생성에 실패 하였습니다. 자세한 사항은 Inner를 참조하십시오.", e);
            }
        }