특정 유형의 메서드 (예 : 제네릭 형식의 메서드)에서 필드 또는 메서드 참조가 FieldDefinition
이 아닌 FieldReference
형식이 될 것으로 나타났습니다. 필드 또는 메서드)가 동일한 유형의 동일한 모듈에 있습니다. 이 FieldReference
에서 어떻게 FieldDefinition
을 얻을 수 있습니까?Mono.Cecil의 참조에서 멤버 정의 가져 오기
나는 module.Import
과 module.MetadataResolver.Resolve
을 시도했지만 둘 다 작동하지 않습니다.
후속은 this까지이지만,보다 일반적인 질문입니다.
편집 :
간단한 제네릭 클래스가 :
public class HelperClass<T>
{
private int _someInt;
void SomeMethod(int i)
{
_someInt = i;
}
}
SomeMethod
의 몸이 포함
...
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: stfdl System.Int32 HelperClass`1<T>::_someInt
....
IL_000a
오피 코드의 피연산자 후, 일반적으로 FieldDefinition
있어야하는데 그것은 모두 동일한 모듈에 있습니다. 하지만 HelperClass
이 제네릭이기 때문에 피연산자는 FieldReference
으로 해결되지 않을 것입니다. 실제로는 전체 이름을 비교하여 실제로 FieldDefinition
을 찾을 수 있습니다.
이 경우 큰 문제는 아니지만 참조가 다른 제네릭 형식의 다른 구성원 인 경우 모든 형식을 열거하는 것보다 더 좋은 방법으로 해당 형식을 찾을 수 있습니다. 정의.
편집 : .Resolve()
수익률이 FieldDefinition
을 반환하는 대신 null로 할 때 HelperClass<>
가 AssemblyDefinition.ReadAssembly
에 의해 런타임에로드되는 모듈에서입니다
, 즉이다.
UPDATE : 그것은 내가 제네릭 형식의 필드 이름을 변경하고 있습니다 때문에, 참조가 파괴되고 Resolve()
가 null 반환 밝혀졌다
. 여전히 this one에 대한 적절한 해결책을 찾으십시오.
참조에서 Resolve()를 호출하는 것이 작동하지 않습니까? (즉,'var myFieldDefinition = myFieldReference.Resolve();') – rileywhite
@rileywhite 아니, null을 반환합니다. 처음에는 정의가되어야한다고 생각했지만 제네릭 타입 멤버에 대한 참조는 Cecil에서 다르게 처리됩니다. – mrahhal
보고있는 것을 재현하는 코드를 게시 할 수 있습니까? – rileywhite