2014-07-24 2 views
-1

저는 Reflection.Emit API를 처음 사용하고 몇 가지 간단한 I/O 검사를 기반으로 종료 코드를 반환하는 진입 점이있는 최소한의 어셈블리를 생성했습니다. 외부 어셈블리를 만드는 이유는 코드 조각이 현재 프로세스 공간 외부에서 실행되어야하고 일시적인 자체가되기 때문입니다. 결국 앱을 만들면 삭제됩니다.동적 어셈블리에 IL을 생성하는 대신 기존 방법을 첨부합니다.

그렇다면 생성 될 코드는 상당히 복잡하므로 과도 조립을 위해 별도의 프로젝트를 만드는 것을 피할 것입니다. 이 ILGenerator를 사용하기에는 IL을 충분히 알지 못합니다.

나는 또한 IL을 생성하기 위해 기존의 방법을 사용하는 것에 대해 this SO question을 읽었으며 IL을 파싱 할 수 없을 것으로 보인다. 기존 방법을 사용하여 현재 컨텍스트에서 분리하고 새로운 동적 유형에 추가하는 방법을 모르겠습니다. 그러한 방법이 존재한다면 그것은이 게시물에 대한 수용 가능한 대답이 될 것입니다.

마지막으로 생성 된 어셈블리에서 생성 어셈블리를 라이브러리로 참조하도록합니다. 두 어셈블리가 모두 WinForms 응용 프로그램이지만 라이브러리로 참조하는 것이 단점입니까?

+1

동적 코드 생성을위한 또 다른 옵션은 C#을 즉시 컴파일 할 수있는 CodeDom API입니다. 소스 텍스트에서 직접 컴파일하거나 오브젝트 모델을 사용할 수 있습니다. –

+0

네, 그건 분명히 옵션입니다. –

+1

'MethodRental'을 보았습니까? http://msdn2.microsoft.com/en-us/library/system.reflection.emit.methodrental – leppie

답변

0

마지막으로 IL을 발생시키지 않고 표현식 트리를 사용하여 해결했습니다.

var queue = new Queue<Expression>(); 
var arguments = Expression.Parameter(typeof(string []), "args"); 

queue.Enqueue(Expression.Call(typeof(Console).GetMethod("WriteLine", new Type [] { }))); 

var block = Expression.Block(queue); 
var lambda = Expression.Lambda<Func<string [], int>>(block, new ParameterExpression [] { arguments }); 

lambda.CompileToMethod(builderMethod); 
// builderMethod is a MethodBuilder instance created earlier. 

ILGenerator를 사용하면 마이크로 퍼펙 (micro-perf)이 필요하지 않은 상황에서 매우 강력하고 확실히 강력합니다.