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);
、1つのかもしれないが、よりあなたを助けることができます:)
これはできません。どのような問題を解決しようとしていますか? – SLaks
私はそれがJITtedされた後にオフセットされた値にアクセスしたいと思います。私はインスタンスの管理されていないメモリへのポインタが必要です。私は、反射を避ける方法を探しました。これに対する動機付けはパフォーマンスです。 – lll
なぜそれをしたいですか?一般的には、私的なフィールドで囲むべきではありませんが、もしあなたが絶対にしなければならないのは、反射が行く方法でしょう。 – juharr