.NET: Показать место хранения или адрес объекта? - PullRequest
1 голос
/ 26 июня 2010

Есть ли способ получить «адрес» объекта? Это для демонстрационных целей, Я знаю, что это плохая идея в целом, и если она вообще работает, то как 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-06-27:

Я, наконец, отказался от идеи сделать это из самой программы .NET. Кажется, не приведет ни к какому хорошему решению. Даже если бы он сработал, он бы настолько загромождал код, что вы едва могли объяснить результат простым способом и использовать его для каких-то демонстрационных целей. Теперь я хотел бы сделать это с помощью хорошего (то есть CLR-осведомленного) отладчика, как описано в ответе ниже.

Отладку можно улучшить внутри VS, активировав опцию в настройках конфигурации Enable Unmanaged Debugging, к сожалению, недоступная в бесплатной экспресс-версии Visual Studio (единственная версия, которую я сейчас имею дома). Есть ли способ заставить Enable Unmanaged Debugging работать вручную?

После нескольких попыток я установил Средства отладки для Windows , которые предоставили мне WinDbg. Отличный инструмент, который я использовал несколько лет назад для разработки драйверов. Теперь это часть огромного пакета. Я пытался следовать инструкциям, чтобы SOS.DLL работал без успеха. Я даже не могу найти эту DLL. Кажется, даже для этого решения в проекте требуется флаг Enable Unmanaged Debugging ...

1 Ответ

3 голосов
/ 26 июня 2010

Чтобы сделать демо значимым, вам нужно сначала прикрепить объект.

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

Я бы продемонстрировал использование SOS (часть пакета Debugging Tools for Windows). Таким образом вы и ваша аудитория приобретете некоторые ценные навыки, а не будете просто махать рукой о деталях реализации CLR.

...