2017-12-01 20 views
0
public class Test 
{ 
    int m_iInt1; // 0x0 
    int m_iInt2; // 0x4 
} 

는 C#에서 다음과 같이 필드에 접근이 가능 필드 값을 액세스 할 수 있습니까?어떻게

+5

그렇게 할 수 없습니다. 어떤 문제를 해결하려고합니까? – SLaks

+0

JITted 후에 값을 오프셋하여 값에 액세스하고 싶습니다. 가능하다고 생각합니다. 인스턴스의 관리되지 않는 메모리에 대한 포인터가 필요합니다. 방금 반사 사용을 피하는 방법을 찾았습니다. 동기 부여는 성능입니다. – lll

+1

왜 그렇게하고 싶습니까? 일반적으로 비공개 필드로 주위를 비웃지 말아야하지만 절대적으로해야한다면 반성 방법이 될 것입니다. – juharr

답변

0

당신은 할 수 없습니다 그렇게.

나는

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

이 교육 목적을 위해 단순히 내가 그런 일 정상 사용하지 알고 소프트웨어의 종류. 이것은 여기에 자세히 설명하지 않을 많은 것들에 사용될 수 있습니다.

-1

시나리오 가정 : 당신이 당신의 유스 케이스를 통해 우리에게 더 많은 통찰력을 줄 경우이

를 작동합니다

var fields = typeof(Test).GetFields(); 
int i = fields[0].GetValue(inst); 

을 하나의 힘은 당신에게 도움이 될 수 있습니다 더 :

+0

나는 반사를 사용하여 그것을하는 방법을 안다. 나는 반사를 피하고 필드의 오프셋을 직접 알고 싶어한다. – lll

+0

'GetValue'에'Test'의 인스턴스를 넘겨 주어야합니다. – juharr

+0

이 답변을 게시 한 후 그것을 보았습니다 :) 아마 당신은 https://stackoverflow.com/a/2120418/2684203 – X39