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 |
|
ADDRESS_KIND_UNMANAGED_THIS_RELATIVE |
|
ADDRESS_KIND_UNMANAGED_PHYSICAL |
|
ADDRESS_KIND_METHOD |
|
ADDRESS_KIND_FIELD |
|
ADDRESS_KIND_LOCAL |
|
ADDRESS_KIND_PARAM |
|
ADDRESS_KIND_ARRAYELEM |
|
ADDRESS_KIND_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