2012-03-18 6 views
8

나는 리플렉션 기반의 C# 코드에서 약간의 동적 메서드를 발견했으며 아직 정확히 무엇인지 알아낼 수 없습니다. 특히 DynamicMethod 클래스가 런타임에서 CLR 메서드를 생성하고 지정하는 것을 허용합니다. 하지만 MethodBuilder 클래스도 있습니다. 둘 다 매우 비슷한 일을하는 것처럼 보입니다. 분명히 "동적 어셈블리"는 AssemblyBuilder 클래스이고 "동적 유형"은 TypeBuilder 클래스입니다. 어쨌든 그들은 모두 System.Reflection.Emit 네임 스페이스에 있습니다.동적 메서드 란 무엇이며 DynamicMethod와 MethodBuilder는 어떻게 다른가요?

MSDN에는이 주제에 대한 소중한 작은 상위 정보가있는 것 같습니다. 따라서 어떤 사람이 동적 인 방법이 무엇인지 설명 할 수 있다면 정확히 여기에 모두 XYZBuilder 클래스가 등장하고, 각각이 사용되는 것은 훌륭합니다. 다른 Reflection.Emit 유형과 내가 알고 있어야하는 기능에 대해서도 감사하겠습니다. 내가 the documentation for DynamicMethod 생각

답변

9

는 잘 설명 :

당신은 동적 어셈블리 및 방법을 포함하는 동적 유형을 생성 할 필요없이 생성하고 런타임에 방법을 실행하기 위해 DynamicMethod 클래스를 사용할 수 있습니다. Just-In-Time (JIT) 컴파일러에 의해 작성된 실행 가능 코드는 DynamicMethod 오브젝트가 교정 될 때 교정됩니다. 동적 메서드는 소량의 코드를 생성하고 실행하는 가장 효율적인 방법입니다.

하나 이상의 메서드를 동적으로 만들어야하는 경우 DynamicMethod을 사용하십시오. 전체 유형을 작성하려면 동적 어셈블리 (AssemblyBuilder)를 작성한 다음 그 안에 모듈을 작성한 다음 (ModuleBuilder) 하나 이상의 유형 (TypeBuilder)을 작성해야합니다. 이러한 유형의 메소드를 작성하려면 MethodBuilder을 사용하십시오.

또 다른 차이점은 GC : DynamicMethod은 항상 가비지 수집 될 수 있으며 하나씩 수집된다는 것입니다. 즉, 사용을 중지하자마자 모든 방법을 수집 할 수 있습니다. 반면, 동적 어셈블리는 사용자가 AssemblyBuilderAccess.RunAndCollect을 사용하여 지정하는 경우에만 수집 할 수 있으며 어셈블리별로 항상 어셈블리로 수집됩니다. 예를 들어 어셈블리에 두 가지 유형이 있고 그 중 하나만 사용하는 경우 다른 하나는 수집 할 수 없습니다.

+0

Doh. 이렇게 늦게 MSDN 페이지를 읽을 때 나는 이것을 놓쳐 버렸음에 틀림 없다. 감사. – Noldorin