2011-03-17 4 views
11

표현식을 실행 코드로 컴파일하고 위임을받을 때 -이 델리게이트에 대한 참조가 더 이상 존재하지 않으면 코드가 가비지 수집합니까?표현 <TDelegate> 컴파일 및 가비지 콜렉션

이에 대한 문서가 있습니까? 왜냐하면 MSDN에서 유용한 것을 찾지 못했기 때문입니다.

답변

11

예, 코드는 가비지 수집 될 수 있습니다. Expression of T에 대해 Compile을 호출하면 코드는 DynamicMethod으로 컴파일되며 가비지 수집에 적합합니다.

사실

그것은 MSDN에 표시하지,하지만 당신은 4.0 배 .NET 무엇을 표현 인 DLR에서 <T> .Compile의 구현을 살펴 가질 수 있습니다

http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638

비록를 컴파일러의 구현은 .net 3.5에서 다르게, DynamicMethods가 여전히 사용되었습니다 (출처 : 저 자신, Mono에서 System.Linq.Expressions를 구현했습니다).

Expression<T>CompileToMethod을 사용하고 RunAndCollect 플래그로 생성되지 않은 AssemblyBuilder에서 MethodBuilder를 전달하면 컴파일 된 표현식 트리를 수집 할 수없는 경우입니다.

+0

DynamicMethod를 사용하고 있습니까? Eric이 제공하는 링크 (http://msdn.microsoft.com/en-us/library/dd554932.aspx)에 따르면 어셈블리를 특수 플래그로 만들어야합니다. 리플렉터에서 DynamicMethod.GetDynamicMethodsModule() 메서드는 RunAndCollect가 포함 된 어셈블리를 만들지 만 실행 만 함께 만들 수 있음을 알 수 있습니다. – Alex

+0

예, DynamicMethod이면 충분하며 MSDN에 표시되어 있습니다. DynamicMethod는 CLR에서 특수 처리되며 실제로 수집 할 수 있습니다. –

+0

네, DynamicMethod 클래스의 문서에서 볼 수 있습니다. 고마워요 :) – Alex