동적 형식 생성을 위해 수집 가능한 어셈블리

수집 가능한 어셈블리란 이를 만드는 데 사용된 응용 프로그램 도메인을 언로드하지 않은 채 언로드할 수 있는 동적 어셈블리입니다. 수집 가능한 어셈블리 및 해당 어셈블리가 포함하는 형식에 사용되는 모든 관리되는 메모리와 관리되지 않는 메모리를 회수할 수 있습니다. 어셈블리 이름 같은 정보는 내부 테이블에서 제거됩니다.

언로드를 활성화하려면 동적 어셈블리를 만들 때 AssemblyBuilderAccess.RunAndCollect 플래그를 사용합니다. 어셈블리는 임시로 유지되므로 저장할 수 없고 수집 가능한 어셈블리에 대한 제한 사항 단원에서 설명하는 제한 사항의 적용을 받습니다. CLR(공용 언어 런타임)에서는 사용자가 어셈블리와 관련된 모든 개체를 해제했을 때 수집 가능한 어셈블리를 자동으로 언로드합니다. 다른 모든 측면에서는 수집 가능한 어셈블리를 만들고 사용하는 방식이 기타 동적 어셈블리의 경우와 같습니다.

수집 가능한 어셈블리의 수명

수집 가능한 동적 어셈블리의 수명은 해당 어셈블리에 포함된 형식을 사용하여 만든 개체 및 그 형식에 대한 참조가 있는지 여부에 의해 결정됩니다. 다음 중 해당하는 항목이 하나 이상 있으면 공용 언어 런타임을 통해 어셈블리가 언로드되지 않습니다. 여기서 T는 어셈블리에 정의되는 임의의 형식입니다.

  • T의 인스턴스

  • T의 배열의 인스턴스 또는 T를 해당 형식 인수 중 하나로 갖는 제네릭 컬렉션의 인스턴스(이러한 배열이나 컬렉션은 비어 있어도 상관이 없습니다.)

  • T를 나타내는 Type 또는 TypeBuilder의 인스턴스

참고참고

어셈블리의 일부를 나타내는 모든 개체를 해제해야 합니다.T를 정의한 ModuleBuilderTypeBuilder에 대한 참조를 계속 유지하고 AssemblyBuilder 개체는 ModuleBuilder에 대한 참조를 계속 유지하므로 이들 개체에 대한 참조를 해제해야 합니다.T를 생성하는 데 사용된 LocalBuilder 또는 ILGenerator가 있어도 언로드가 이루어지지 않습니다.

  • 코드를 실행하여 계속 사용할 수 있는 동적으로 정의되는 다른 T1 형식에서 T를 정적으로 참조하는 경우. 예를 들어 T1이 T에서 파생되거나 T가 T1의 메서드에 있는 매개 변수의 형식일 수 있습니다.

  • T에 속하는 정적 필드에 대한 ByRef

  • T 또는 T의 구성 요소를 참조하는 RuntimeTypeHandle, RuntimeFieldHandle 또는 RuntimeMethodHandle

  • T를 나타내는 Type 개체에 액세스하는 데 직접 또는 간접적으로 사용할 수 있는 모든 리플렉션 개체의 인스턴스. 예를 들어 해당 요소 형식이 T인 배열 형식이나 T를 형식 인수로 갖는 제네릭 형식으로부터 T에 대한 Type 개체를 구할 수 있습니다.

  • 임의의 스레드의 호출 스택에 대한 메서드 M. 여기서 M은 T의 메서드이거나 어셈블리에 정의되는 모듈 수준 메서드입니다.

  • 어셈블리의 모듈에 정의되는 정적 메서드에 대한 대리자

어셈블리의 형식 하나 또는 메서드 하나에 대해 이 목록의 항목이 하나만 존재하는 경우 런타임에 어셈블리를 언로드할 수 없습니다.

참고참고

목록의 모든 항목에 대해 종료자를 실행하기 전까지는 런타임에 어셈블리가 실제로 언로드되지 않습니다.

수집 가능한 어셈블리를 생성하는 과정에서 만들어 사용하는 List<int>(Visual Basic의 List(Of Integer)) 같은 생성된 제네릭 형식이 제네릭 형식 정의를 포함하는 어셈블리 또는 해당 형식 인수 중 하나의 정의를 포함하는 어셈블리에 정의되어 있는 것으로 간주하고 수명을 추적하는 데 이를 활용합니다. 실제로 사용되는 정확한 어셈블리는 구현에 따라 차이가 있으며 변경될 수 있습니다.

수집 가능한 어셈블리에 대한 제한 사항

수집 가능한 어셈블리에는 다음과 같은 제한 사항이 적용됩니다.

  • 정적 참조 일반적인 동적 어셈블리의 형식에서는 수집 가능한 어셈블리에 정의된 형식을 정적으로 참조할 수 없습니다. 예를 들어 수집 가능한 어셈블리의 형식을 상속하는 일반 형식을 정의하면 NotSupportedException 예외가 throw됩니다. 수집 가능한 어셈블리의 형식에서는 다른 수집 가능한 어셈블리의 형식을 정적으로 참조할 수 있지만 이 경우 참조 대상 어셈블리의 수명이 참조 주체 어셈블리의 수명으로 연장됩니다.

  • COM interop 수집 가능한 어셈블리 내에는 COM 인터페이스를 정의할 수 없으며, 수집 가능한 어셈블리 내의 형식 인스턴스를 COM 개체로 변환할 수 없습니다. 수집 가능한 어셈블리의 형식은 CCW(COM 호출 가능 래퍼)나 RCW(런타임 호출 가능 래퍼)로 사용할 수 없습니다. 그러나 수집 가능한 어셈블리의 형식에서 COM 인터페이스를 구현하는 개체를 사용할 수는 있습니다.

  • 플랫폼 호출 DllImportAttribute 특성이 있는 메서드를 수집 가능한 어셈블리 내에서 선언하면 해당 메서드가 컴파일되지 않습니다. 수집 가능한 어셈블리의 형식을 구현하는 데는 OpCodes.Calli 명령을 사용할 수 없으며 그와 같은 형식을 비관리 코드로 마샬링할 수도 없습니다. 그러나 수집 가능한 어셈블리 이외의 어셈블리에 선언된 진입점을 사용하여 네이티브 코드를 호출할 수는 있습니다.

  • 마샬링 특히 대리자를 비롯하여 수집 가능한 어셈블리에 정의된 개체는 마샬링할 수 없습니다. 이 제한 사항은 임시로 생성되는 모든 형식에 적용됩니다.

  • 어셈블리 로드 수집 가능한 어셈블리를 로드하는 데는 리플렉션 내보내기 메커니즘만 지원됩니다. 다른 어셈블리 로드 방식을 사용하여 로드한 어셈블리는 언로드할 수 없습니다.

  • 컨텍스트 바인딩 개체 컨텍스트에 정적인 변수는 지원되지 않습니다. 수집 가능한 어셈블리의 형식으로는 ContextBoundObject를 확장할 수 없습니다. 그러나 수집 가능한 어셈블리의 코드에서 다른 곳에 정의되어 있는 컨텍스트 바인딩 개체를 사용할 수는 있습니다.

  • 스레드에 정적인 데이터 스레드에 정적인 변수는 지원되지 않습니다.

참고 항목

기타 리소스

동적 메서드 및 어셈블리 생성