AppDomain 로드 및 해제 dll

6622 단어 domain
몇 년 전에 동명 수필을 썼지만 오늘은 그다지 적용되지 않을 것이다.하지만 몇 명의 친구들이 댓글을 남겨서 관련 코드를 다시 발표했다.
우선 우리의 목적은 실행 기간에 dll을 업데이트하고 dll을 적용하는 것입니다.이 과정은 AppDomain을 적용해서 해결해야 한다. 방법은 새로운 AppDomain을 만들어서 dll을 불러오고, dll 업데이트 후에 새로운 AppDomain을 만들어서 새로운 dll을 불러오는 것이다.
자, 우리는 두 개의 목록을 완성해야 합니다.
첫 번째 목표: 실행할 때 dll을 업데이트할 수 있습니다.
1. AppDomain을 만들 때 ShadowCopyFiles 설정

  
    
AppDomainSetup _setup = new AppDomainSetup();
_setup.ShadowCopyFiles
= " true " ;
_setup.LoaderOptimization
= LoaderOptimization.SingleDomain;
AppDomain _curDomain
= AppDomain.CreateDomain( " TestDomain " , null , _setup);

 2.주 프로그램이 dll에 동적 불러오는 대상의 실례를 인용해야 할 때, 이 실례는 프록시 클래스로 만들어야 합니다.프록시 클래스는 클래스가 MarshalByRefObject에서 상속되어야 한다는 뜻입니다.이 프록시 클래스는 일반적으로 다른 공공 라이브러리에서 기본 클래스나 인터페이스를 정의해서 사용합니다.자, 먼저 앞에서 만든 프로그램 영역에서 프록시 클래스를 만드는 실례를 봅시다.

  
    
System.Runtime.Remoting.ObjectHandle objHandle = pJobDomain.CreateInstanceFrom(strDllFilePath, strClassName);
object objBuild = objHandle.Unwrap();

if (objBuild == null )
throw new Exception( " buildWorker -- " );
else
ido
= (IDo)objBuild; // IDo

자, 만약strDllFilePath="ClassLibrary.dll"를 실행한다면 디렉터리의ClassLibrary를 실행합니다.dll 파일이 불러온 후에도 우리는 마음대로 그를 업데이트할 수 있습니다.그러나 업데이트 후 프로그램 영역을 다시 만들지 않으면 위의 방법으로 프록시 실례를 다시 만듭니다. 프로그램이 불러올 때 Shadow Copy Files = "true"를 설정했기 때문에 새로운 dll의 실행 효과를 볼 수 없습니다.그럼요. "false"로 설정하면 안 돼요?너는 해 볼 수 있지만, 내가 말하고자 하는 것은, 만약 이렇게 된다면, 우리의 첫 번째 목표도 완성할 수 없다는 것이다.
두 번째 목표: 새로운 dll을 적용합니다.
사실 간단합니다. UnLoad 다음에 다시 만들고 새로운 AppDomain으로 프록시 클래스를 만들면 프로그램에서 새로운 dll의 효과를 볼 수 있습니다.자, 실행할 때마다 새로운 프로그램 영역을 만들 수 있는 방법을 정의했습니다.

  
    
AppDomain _curDomain;
private void load()
{
if (_curDomain != null ) //
{
AppDomain.Unload(_curDomain);
//
_curDomain = null ;
}
AppDomainSetup _setup
= new AppDomainSetup();
_setup.ShadowCopyFiles
= " true " ;
_setup.LoaderOptimization
= LoaderOptimization.SingleDomain;
_curDomain
= AppDomain.CreateDomain( " TestDomain " , null , _setup);
}

하나 제공kevin-y 테스트의 원본 코드 다운로드

좋은 웹페이지 즐겨찾기