2013-08-15 1 views
1

.NET 어셈블리의 바이트 코드를 미리 컴파일하는 프로그램을 만들고 있습니다. 이 프로그램 자체는 .NET 프로그램입니다. 지금까지 리플렉션을 사용하여 바이트 코드 자체를 포함하여 필요한 모든 정보를 추출 할 수있었습니다. 그러나 ldfld에 대한 번역 구현과 관련된 문제가 발생했습니다.Reflect를 통해 FieldRef 및 FieldDef 메타 데이터 토큰 조회

ldfld 유사한 명령들은 의 FieldRef 또는 FieldDef를 참조 그 인코딩 내에 메타 데이터 토큰을 갖는다. 어셈블리의 PE 파일에 포함 된 메타 데이터 테이블의 요소라는 것을 알고 있습니다. 최악의 경우에는 PE 파일을 열고이 모든 것을 직접 확인하기에 충분한 정보가 ECMA-335에서 있지만 작업량이 많아서 Reflection을 통해 얻을 수있는 다른 정보와 일치하지 않으므로 Reflection을 통해이 조회를 수행 할 수 있습니다.

그러나 메타 데이터 토큰을 찾는 System.Reflection.Assembly에는 아무런 방법도 찾을 수 없습니다. (나는 그것을 놓친 것 같습니다.) 메타 데이터 (catch-22.)를 볼 때까지는 참조하는 어셈블리 만 알기 때문에 어셈블리보다 더 구체적인 것을 조회 할 수는 없습니다. 주석에서 언급했듯이, 메타 데이터를 검사 할 때까지 이 정의 된 어셈블리가인지조차 알지 못합니다.

리플렉션을 통해 이러한 메타 데이터 토큰을 조회 할 수있는 방법이 있습니까? FieldDef과의 FieldRef 어셈블리에 속하지 않기 때문에

+1

다른 방법으로 가면 Assembly.GetTypes => Type.GetFields => FieldInfo.MetadataToken이됩니다. –

+0

@ 한스 : 팁 주셔서 감사합니다. 작동해야합니다. MSDN의 왼쪽 창에서 트리보기로 이동하도록 가르쳐줍니다 ... MetadataToken은 전혀 없었지만 "Properties"제목을 클릭하면 결과 페이지에서 보았습니다. 사용자 친화적이지 않았습니다. 사이트 디자인! – Kevin

+1

@HansPassant .. 그러나 내가 생각할 수있는 한 가지 가능한 문제는 정의 객체가 다른 어셈블리에 있으면'ldfld'의 토큰이 다른 어셈블리에 있기 때문에이 방법으로 찾을 수 없다는 것입니다. _consuming_ 어셈블리에서만 FieldRef로서 유효하며 필드를 정의하는 어셈블리에는 유효하지 않습니다. – Kevin

답변

2

당신은 Assembly 아무것도 발견하지 못했다는, 그들은 (대부분의 어셈블리는 단지 하나의 모듈을 가지고 있지만, 그들은 더있을 수 있음) 모듈에 속한다. 그리고 Module에는 정확히 원하는 방법이 있습니다 : ResolveField(). 다음과 같이 사용하십시오 :

Module module = …; 
int fieldToken = …; 
FieldInfo field = module.ResolveField(fieldToken); 
+0

고마워요. 그게 제가 찾던 바로 그 것입니다. 나는'Module'을 체크해야한다고 생각 했었지만, 나는 실행 파일과 어셈블리 사이에 1 : 1로 익숙하다. – Kevin

관련 문제