Поделиться через


DEBUG_ADDRESS_UNION

Описывает различные типы адресов.

typedef struct _tagDEBUG_ADDRESS_UNION {
   ADDRESS_KIND dwKind;
   union {
      NATIVE_ADDRESS                  addrNative;
      UNMANAGED_ADDRESS_THIS_RELATIVE addrThisRel;
      UNMANAGED_ADDRESS_PHYSICAL      addrUPhysical;
      METADATA_ADDRESS_METHOD         addrMethod;
      METADATA_ADDRESS_FIELD          addrField;
      METADATA_ADDRESS_LOCAL          addrLocal;
      METADATA_ADDRESS_PARAM          addrParam;
      METADATA_ADDRESS_ARRAYELEM      addrArrayElem;
      METADATA_ADDRESS_RETVAL         addrRetVal;
      DWORD                           unused;
   } addr;
} DEBUG_ADDRESS_UNION;
public struct DEBUG_ADDRESS_UNION {
   public ADDRESS_KIND dwKind;
   public IntPtr       unionmember;
}

Термины

  • dwKind
    Значение ADDRESS_KIND перечисление, определяющее способ интерпретации соединение.

  • addr.addrNative
    [C++ содержит только] NATIVE_ADDRESS если структура dwKind = ADDRESS_KIND_NATIVE.

  • addr.addrThisRel
    [C++ содержит только]UNMANAGED_ADDRESS_THIS_RELATIVE если структура dwKind = ADDRESS_KIND_UNMANAGED_THIS_RELATIVE.

  • addr.addUPhysical
    [C++ содержит только]UNMANAGED_ADDRESS_PHYSICAL если структура dwKind = ADDRESS_KIND_UNMANAGED_PHYSICAL.

  • addr.addrMethod
    [C++ содержит только]METADATA_ADDRESS_METHOD если структура dwKind = ADDRESS_KIND_METHOD.

  • addr.addrField
    [C++ содержит только]METADATA_ADDRESS_FIELD если структура dwKind = ADDRESS_KIND_FIELD.

  • addr.addrLocal
    [C++ содержит только]METADATA_ADDRESS_LOCAL если структура dwKind = ADDRESS_KIND_LOCAL.

  • addr.addrParam
    [C++ содержит только]METADATA_ADDRESS_PARAM если структура dwKind = ADDRESS_KIND_PARAM.

  • addr.addrArrayElem
    [C++ содержит только]METADATA_ADDRESS_ARRAYELEM если структура dwKind = ADDRESS_KIND_ARRAYELEM.

  • addr.addrRetVal
    [C++ содержит только]METADATA_ADDRESS_RETVAL если структура dwKind = ADDRESS_KIND_RETVAL.

  • addr.unused
    [C++] только заполнение.

  • addr
    [C++] только имя соединения.

  • unionmember
    [C#] только это значение нужно будет маршалировать по соответствующему типу структуры в соответствии on dwKind. См. примечания для ассоциации dwKind и интерпретация соединения.

Заметки

Эта структура является частью DEBUG_ADDRESS структура и представляет один из нескольких разных типов адресов ( DEBUG_ADDRESS структура заполняемую вызовом IDebugAddress::GetAddress метод).

[C#] только в следующей таблице показано, как интерпретировать unionmember элемент для каждого типа адреса. Пример показывает, как это делается для одного типа адреса.

dwKind

unionmember интерпретируется как

ADDRESS_KIND_NATIVE

NATIVE_ADDRESS

ADDRESS_KIND_UNMANAGED_THIS_RELATIVE

UNMANAGED_ADDRESS_THIS_RELATIVE

ADDRESS_KIND_UNMANAGED_PHYSICAL

UNMANAGED_ADDRESS_PHYSICAL

ADDRESS_KIND_METHOD

METADATA_ADDRESS_METHOD

ADDRESS_KIND_FIELD

METADATA_ADDRESS_FIELD

ADDRESS_KIND_LOCAL

METADATA_ADDRESS_LOCAL

ADDRESS_KIND_PARAM

METADATA_ADDRESS_PARAM

ADDRESS_KIND_ARRAYELEM

METADATA_ADDRESS_ARRAYELEM

ADDRESS_KIND_RETVAL

METADATA_ADDRESS_RETVAL

Пример

В этом примере показано, как интерпретировать один тип адреса (METADATA_ADDRESS_ARRAYELEM) DEBUG_ADDRESS_UNION структура в c#. Остальные элементы можно интерпретировать способом те же.

using System;
using System.Runtime.Interop.Services;
using Microsoft.VisualStudio.Debugger.Interop;

namespace MyPackage
{
    public class MyClass
    {
        public void Interpret(DEBUG_ADDRESS_UNION dau)
        {
            if (dau.dwKind == (uint)enum_ADDRESS_KIND.ADDRESS_KIND_METADATA_ARRAYELEM)
            {
                 METADATA_ADDRESS_ARRAYELEM arrayElem =
                     (METADATA_ADDRESS_ARRAYELEM)Marshal.PtrToStructure(dau.unionmember,
                                 typeof(METADATA_ADDRESS_ARRAYELEM));
            }
        }
    }
}

Требования

Заголовок: sh.h

Пространство имен: Microsoft.VisualStudio.Debugger.Interop

Сборка: Microsoft.VisualStudio.Debugger.Interop.dll

См. также

Ссылки

структуры и объединения

DEBUG_ADDRESS

ADDRESS_KIND

IDebugAddress::GetAddress