2009-08-17 7 views
3

.NET Framework 4.0은 Reflection API에 여러 항목을 도입하여 매우 유용하므로 중요한 작업입니다. 그 중에는 Assembly, Module, MethodBodyLocalVariableInfo 및 새로운 CustomAttributeData 클래스의 보호 된 생성자가 있습니다. 아직 해결해야 할 몇 가지 항목이 있습니다. 나는 사람들이 같은 그룹에 쉽게 적용된다고 믿는다. 나는 방금 언급 한 유형을 확장해야 할 것이다.`OpCode`의 인스턴스를 만들 수 있습니까?

이번에 : 나는 자신의 매개 변수를 사용하여 System.Reflection.Emit.OpCode 구조체의 인스턴스를 생성하는 방법을 찾고 있습니다. 현재 내부 생성자를 호출하여 인스턴스를 만듭니다. 생성 된 항목을 다시 사용하기 위해 클래스의 구성원 인 public static readonly으로 노출하기 때문에 성능에 해가되지 않지만, 이것이 극도로 차선책 인 시나리오라고 생각할 수 있습니다.

ILGenerator와 함께 사용할 수 없습니다 사용자 구성 OpCode들 상태 문서와 현재의 내부 OpCode 생성자를 공개하는 것이 불가능하다 어떤 이유가 있나요.

편집 : 예를 들어 보겠습니다. 다음과 같은 사용자 지정 opcode를 작성하여 임시 로컬 변수를 만들지 않고도 중간 명령어 목록간에 바이트 코드 변환으로 사용할 수 있습니다. 일리노이를 방출하는 경우 나머지 swap 명령어를 유효한 IL 표현으로 변환 하겠지만 다음 단계는 사용자 정의 swap 명령어를 이해하는 JIT입니다. Prefix2 접두어 0xFD을 사용하고 있는데, 유효한 IL 연산 코드에 의해 예약되어 사용되지 않습니다.

/// <summary> 
/// Swaps adjacent elements on the evaluation stack. The supplied inline int32 argument gives the 
/// index of the topmost item in the pair. 
/// </summary> 
public static readonly OpCode Swap; 

또한 간단한/일반 관리 코드 표현을 가지고 있지만 다양한 네이티브 코드 생성기에서 사용할 수있는 간단한 플랫폼에 따라 표현이없는 JIT 내장이 사용할 것입니다. 이들 중 하나는 ldthread (현재 관리되는 스레드의 RuntimeThread 표현에 대한 참조를로드 함)입니다.

+2

1.0 이후로 주변에 있었던 http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcode.aspx를 의미합니까? –

+0

예, 그 중 하나입니다. –

답변

0

OpCode 인스턴스는 정확히 Common Language Infrastructure (CLI) documentation에서 파생되므로 사용자 정의 OpCode 인스턴스를 만들 수 있다고 생각하지 않습니다. 따라서 귀하의 사례가 합리적이라 할지라도 OpCode는 갈 길이 멀지 않습니다.

+1

사전 정의 된 OpCode 인스턴스는 문서를 기반으로하지만 구조체 자체는 TR/84의 일부가 아닙니다. 이 애플리케이션의 코드가 * so * clean 인 이유 중 일부는 OpCode 생성자를 호출하여 새 인스턴스를 만드는 데 사용됩니다. ILGenerator에 결과를 보내기 전에 IL을 수행하는 모든 사람이 "특수"opcode를 중간 결과에 포함시키는 기능은 매우 유용 할 수 있으며 OpCode를 실제로 사용하는 좁은 기술적 인 사용자 기반이 주어지면 열려는 것이 해로운 것처럼 보이지 않습니다 이 경우. 유효하지 않은 코드로 인해 ILGenerator를 던지게하십시오. –

+1

나는 그 필요성을 이해한다. 어쩌면 MVP의 도움으로 마이크로 소프트가 생성자를 공개 할 수 있습니다. –

0

중간 결과에 자체 IL-Opcode를 사용하고 마지막 단계에서 실제 opcode로 변환하지 않는 이유는 무엇입니까?

관련 문제