2013-04-15 7 views
1

를 수집명시 적으로 <a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx" rel="nofollow">MSDN</a>에서 DynamicMethod

당신은 동적 조립 및 방법을 포함 할 동적 유형을 생성 할 필요없이 생성 및 실행시 방법 을 실행하기 위해 DynamicMethod 클래스를 사용할 수 있습니다. JIT (Just-In-Time) 컴파일러에서 만든 실행 가능 코드는 DynamicMethod 개체 을 회수 할 때 재사용됩니다. 동적 메서드는 을 생성하고 소량의 코드를 실행하는 가장 효율적인 방법입니다.

I는 다음과 같은 코드가 :

Type returnType = typeof(string); 
Type[] argTypes = { typeof(string), typeof(IEnumerable<string>) }; 

var dynamicMethod = new DynamicMethod("DynamicMethod1", returnType, argTypes); 
ILGenerator ilGen = dynamicMethod.GetILGenerator(); 
const string Returned = "returned"; 
ilGen.Emit(OpCodes.Ldstr, Returned); 
ilGen.Emit(OpCodes.Ret); 

var handler = 
    (Func<string, IEnumerable<string>, string>) 
    dynamicMethod.CreateDelegate(typeof(Func<string, IEnumerable<string>, string>)); 

즉, 난 간단한 본체 동적 생성 방법을, 그럼 정적 속성 위임을 저장할. 이 대리인의 여러 호출 후 reclaim/메서드를 수집하고 다른 본문을 다시 만들고 (나는 인터프리터 언어를 작성, 내 사용자 지정 구문을 MSIL 바이트 코드 - 컴파일러 같은 해석합니다) 정적 속성에 새 대리자를 저장합니다.

동적 방법을 명시 적으로 수집/재 확보 할 수있는 방법은 무엇입니까?

+3

C#에서 모든 개체와 같은 방법에 따라 "모든 세대의 즉각적인 가비지 수집을 강제로"당신이 그것을 수집 할 때 그러나 GarbageCollector을 알 수 있습니다. 그것을 참조하지 않고 수집하도록하십시오. –

+0

동적 메서드에 대한 모든 참조를 제거하면 GC가 메모리에서이 메서드를 제거하는 순간을 알지 못하며 같은 이름 ("DynamicMethod1")을 사용하여 새 메서드를 만들 수 없다는 것을 알지 못합니다. –

+2

물론 전달하는 이름은 범위 지정 목적과 전혀 관련이 없습니다. 그렇지 않은 경우, 다른 API가 같은 이름의 메소드를 작성하려고하면 어떤 일이 발생합니까? 모든 참조를 제거하고 나중에 언젠가는 수집하도록 허용하고, 언제든지 대체 구현을 작성하십시오. 중요한 것은'(임의의) 이름이 아닌'DynamicMethod'의 인스턴스에 대한 핸들입니다. –

답변

0

DynamicMethod는 IDisposable 인터페이스를 구현하지 않으므로 명시 적으로 삭제할 수 없습니다. System.GC.Collect();

MSDN

+0

명시 적으로'GC.Collect()'를 호출하는 것은 바람직하지 않음을 유의하십시오. – TiMoch

+0

강제로 수집하고 싶다면 갈 수있는 방법입니다, 맞습니까? – Mzn

+0

예, 그렇습니다. 그러나 전체 모음은 모든 실행 스레드를 중지합니다. 경험 법칙은 필요시 수집하도록 GC를 신뢰하는 것입니다. 동적 메서드는 대개 가볍고 부과하는 메모리 압력이 너무 낮으므로 컬렉션이 중요하지 않아야합니다. 실제 쓰레기 수거와 비슷하지만 집 앞쪽에 하나의 봉투를 보관했기 때문에시 전역의 쓰레기 수거를 요구하지 않습니다. 당신은 정기적으로 가비지 콜렉션이 매주 일어날 때까지 기다리는 것입니다. – TiMoch

관련 문제