1

オブジェクトの「アドレス」を取得する方法はありますか? これはデモンストレーション用です。これは一般的には悪い考えであり、コードとして機能する場合は理解していunsafeます。プロジェクトは、安全でないコードを許可するように調整されています。しかし、私の試みは失敗しました。私がこれまでに持っているコードはコンパイルされていません:

    unsafe static String AddressOf(Object o)
    {
        void* p = &o;
        return String.Format("{0}", new IntPtr(p));
    }

Error: Cannot take the address of, get the size of, or declare a pointer to a managed type ('object')

メモリアドレスを取得できない場合でも、メモリスロットまたはそのオブジェクトの場所を示す何かが考えられます。

背景: 私の意図は、値渡しと参照渡しの違いを示すデモを作成し、これらのオブジェクトの場所をダンプすることです。

2010 年 6 月 27 日追加:

私は最終的に、.NET プログラム自体からそれを行うという考えを放棄しました。良い解決策にはならないようです。たとえそれが機能したとしても、コードが乱雑になり、結果を簡単な方法で説明したり、デモ目的で使用したりすることはほとんどできません。以下の回答でアドバイスされている方法で、優れた(CLR対応を意味する)デバッガーを使用して実行したいと思います。

デバッグは、構成設定のオプションを有効にすることで VS 内で改善できますがEnable Unmanaged Debugging、残念ながら、Visual Studio の無料エクスプレス エディション (現在自宅にある唯一のバージョン) では利用できません。手動で機能させる方法はありますか?Enable Unmanaged Debugging

少し苦労した後、WinDbg を提供するDebugging Tools for Windowsをインストールしました。何年も前にドライバー開発に使用した優れたツールです。今では巨大なパッケージの一部です。指示に従って、SOS.DLL の方法を成功させようとしましたが、成功しませんでした。このDLLも見つかりません。このソリューションでもEnable Unmanaged Debugging、プロジェクトにフラグが必要なようです...

4

1 に答える 1

3

デモを意味のあるものにするために、最初にオブジェクトを固定する必要があります。

GCHandle handle = GCHandle.Alloc(o, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();

SOS (Debugging Tools for Windows パッケージの一部)を使用してデモンストレーションを行います。あなたとあなたの聴衆は、CLR 実装の詳細について手を振るだけでなく、実際にその方法でいくつかの貴重なスキルを得ることができます。

于 2010-06-26T15:00:51.503 に答える