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