public class Test
{
int m_iInt1; // 0x0
int m_iInt2; // 0x4
}
는 C#에서 다음과 같이 필드에 접근이 가능 필드 값을 액세스 할 수 있습니까?어떻게
public class Test
{
int m_iInt1; // 0x0
int m_iInt2; // 0x4
}
는 C#에서 다음과 같이 필드에 접근이 가능 필드 값을 액세스 할 수 있습니까?어떻게
당신은 할 수 없습니다 그렇게.
나는
var inst = new Test();
unsafe
{
var reference = __makeref(inst); // could also be retrieved with GCHandle.Alloc
IntPtr ptr = **(IntPtr**)(&reference);
int* x = (int*)ptr;
Console.WriteLine(x[1]); // prints m_iInt1
Console.WriteLine(x[2]); // prints m_iInt2
Console.WriteLine(*(int*)((int)ptr + 0x4)); // same as above
Console.WriteLine(*(int*)((int)ptr + 0x8));
}
나는 가정 할 수 있습니다 여기에 설명 된대로
*(int*)((int)ptr + 0x0)
는 방법 테이블 포인터 :
http://blogs.microsoft.co.il/sasha/2012/03/15/virtual-method-dispatch-and-object-layout-changes-in-clr-40/ 및
http://yonifedaeli.blogspot.com/2017/03/sync-block-index-sbi-object-header-word.html
이 교육 목적을 위해 단순히 내가 그런 일 정상 사용하지 알고 소프트웨어의 종류. 이것은 여기에 자세히 설명하지 않을 많은 것들에 사용될 수 있습니다.
시나리오 가정 : 당신이 당신의 유스 케이스를 통해 우리에게 더 많은 통찰력을 줄 경우이
를 작동합니다
var fields = typeof(Test).GetFields();
int i = fields[0].GetValue(inst);
을 하나의 힘은 당신에게 도움이 될 수 있습니다 더 :
그렇게 할 수 없습니다. 어떤 문제를 해결하려고합니까? – SLaks
JITted 후에 값을 오프셋하여 값에 액세스하고 싶습니다. 가능하다고 생각합니다. 인스턴스의 관리되지 않는 메모리에 대한 포인터가 필요합니다. 방금 반사 사용을 피하는 방법을 찾았습니다. 동기 부여는 성능입니다. – lll
왜 그렇게하고 싶습니까? 일반적으로 비공개 필드로 주위를 비웃지 말아야하지만 절대적으로해야한다면 반성 방법이 될 것입니다. – juharr