.NET 어셈블리의 바이트 코드를 미리 컴파일하는 프로그램을 만들고 있습니다. 이 프로그램 자체는 .NET 프로그램입니다. 지금까지 리플렉션을 사용하여 바이트 코드 자체를 포함하여 필요한 모든 정보를 추출 할 수있었습니다. 그러나 ldfld
에 대한 번역 구현과 관련된 문제가 발생했습니다.Reflect를 통해 FieldRef 및 FieldDef 메타 데이터 토큰 조회
ldfld
유사한 명령들은 의 FieldRef 또는 FieldDef를 참조 그 인코딩 내에 메타 데이터 토큰을 갖는다. 어셈블리의 PE 파일에 포함 된 메타 데이터 테이블의 요소라는 것을 알고 있습니다. 최악의 경우에는 PE 파일을 열고이 모든 것을 직접 확인하기에 충분한 정보가 ECMA-335에서 있지만 작업량이 많아서 Reflection을 통해 얻을 수있는 다른 정보와 일치하지 않으므로 Reflection을 통해이 조회를 수행 할 수 있습니다.
그러나 메타 데이터 토큰을 찾는 System.Reflection.Assembly
에는 아무런 방법도 찾을 수 없습니다. (나는 그것을 놓친 것 같습니다.) 메타 데이터 (catch-22.)를 볼 때까지는 참조하는 어셈블리 만 알기 때문에 어셈블리보다 더 구체적인 것을 조회 할 수는 없습니다. 주석에서 언급했듯이, 메타 데이터를 검사 할 때까지 이 정의 된 어셈블리가인지조차 알지 못합니다.
리플렉션을 통해 이러한 메타 데이터 토큰을 조회 할 수있는 방법이 있습니까? FieldDef과의 FieldRef 어셈블리에 속하지 않기 때문에
다른 방법으로 가면 Assembly.GetTypes => Type.GetFields => FieldInfo.MetadataToken이됩니다. –
@ 한스 : 팁 주셔서 감사합니다. 작동해야합니다. MSDN의 왼쪽 창에서 트리보기로 이동하도록 가르쳐줍니다 ... MetadataToken은 전혀 없었지만 "Properties"제목을 클릭하면 결과 페이지에서 보았습니다. 사용자 친화적이지 않았습니다. 사이트 디자인! – Kevin
@HansPassant .. 그러나 내가 생각할 수있는 한 가지 가능한 문제는 정의 객체가 다른 어셈블리에 있으면'ldfld'의 토큰이 다른 어셈블리에 있기 때문에이 방법으로 찾을 수 없다는 것입니다. _consuming_ 어셈블리에서만 FieldRef로서 유효하며 필드를 정의하는 어셈블리에는 유효하지 않습니다. – Kevin