/// <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; } }
/// <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; } }
internal TESTINVOKER(MethodInvokerCore core, RefCounter instanceRefCounter, object[] args) : base(core, instanceRefCounter, null) { OKOK = true; }
/// <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); } }
/// <summary> /// 내부 필드를 초기화하는 기본 생성자 /// </summary> private MethodInvoker() { _core = null; _instanceRefCounter = null; _isValid = false; _wasCallDispose = false; EventInvalidInvoker = null; }
public void RegisterSubCounter(RefCounter subCounter) { if (_subCounters != null) { _subCounters.Add(subCounter); //부모 카운터 설정 subCounter._parent = this; } }
public bool UnregisterSubCounter(RefCounter subCounter) { if (_subCounters != null) { subCounter._parent = null; return(_subCounters.Remove(subCounter)); } else { return(false); } }
/// <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); } } }
/// <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; }
/// <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; }
/// <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); } }