2009-09-03 2 views

답변

8

개별 어셈블리를 언로드 할 수 없습니다. 전체 AppDomain을 언로드해야합니다. 즉, 다른 어셈블리 (및 관련 코드)를 새 AppDomain에로드해야하며 언로드 할 때 AppDomain을 언로드해야합니다.

물론 AppDomains 간의 호출을 마샬링하는 것에 대해 걱정할 필요가 있기 때문에 인생이 훨씬 어려워집니다.

+0

이것은 작업 관리자에서 응용 프로그램을 종료해야 응용 프로그램을 종료 할 수 있기 때문에 배경 화면입니다. 그런 응용 프로그램을 죽인 후에도 .dll은 언로드되지 않습니다. 그래서 내가 강제로 언로 드하길 원합니다. 다른 방법은 무엇입니까? – Anuya

+3

프로세스가 사라진 경우 DLL에 보유되어서는 안됩니다. 다른 프로세스가 아니라고 확신합니까? SysInternals 도구를 사용하여 확인하십시오. –

+0

martialling -> marshalling? 사실, 앱 도메인간에 정렬 될 수있는 유형/인스턴스에 대한 제한이 있다고 생각합니다. –

3

Jon Skeet이 쓴 것처럼 DLL을 언로드 할 수 없지만 다른 AppDomain에서 DLL을로드 한 다음 AppDomain을 언로드 할 수 있습니다. 그게 유일한 방법입니다.

그러나 AppDomain에서 자연스럽게 함수를 호출해야하기 때문에 다양해야합니다. 이것은 두 가지 다른 방식으로 발생할 수 있습니다.

하나의 AppDomain (A라고 부름)에서 AppDomain B에서 인스턴스화 된 개체에 대한 참조를 얻으면 기본적으로 AppDomain 경계를 통해 개체가 serialize됩니다. 즉, A가 액세스하는 객체 인스턴스는 B가 액세스하는 인스턴스가 아니며 객체에서 다시 전송할 기능을 제공하지 않으면 A에서 수정 한 내용이 B에 반영되지 않습니다. 이를 위해서는 객체가 Serializable으로 표시되어야합니다.

그러나 클래스가 MarshalByRefObject에서 상속되도록함으로써 직렬화를 피할 수 있습니다. 개체가 AppDomain B에서 생성되고 AppDomain A에서 호출되면 호출은 AppDomain 경계를 넘습니다. 여전히 동일한 물리적 스레드이므로 교차 프로세스 호출이나 COM 교차 아파트 호출 에서처럼 스레드 전환의 오버 헤드가 없습니다.

그러나 A에서 개체가 참조하는 B에서 개체를 구성했지만 B의 개체가 5 분 동안 액세스되지 않으면 개체가 삭제됩니다. 이 동작은 MarshalByRefObject.InitializeLifetimeService()에서 재정의 할 수 있습니다.

관련 문제