2017-12-01 9 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); 

、1つのかもしれないが、よりあなたを助けることができます:)

+0

私は反射を使ってそれを行う方法を知っています。私はちょうど反射を避け、フィールドのオフセットを直接知ってそれにアクセスしたいと思っています。 – lll

+0

'GetValue'に' Test'のインスタンスを渡す必要があります。 – juharr

+0

私はこの答えを投稿した後に見た: おそらく見てみたいhttps://stackoverflow.com/a/2120418/2684203 – X39