Freigeben über


Implementieren von GetMethodProperty

Wichtig

Seit Visual Studio 2015 ist diese Art der Implementierung von Ausdrucksauswertungen veraltet. Informationen zum Implementieren von CLR-Ausdrucksauswertungen finden Sie unter CLR-Ausdrucksauswertungen und Beispiel für die Auswertung verwalteter Ausdrücke.

Visual Studio ruft die GetDebugProperty -Methode (DE) des Debugmoduls auf, die wiederum GetMethodProperty aufruft, um Informationen über die aktuelle Methode im Stapelframe abzurufen.

Diese Implementierung führt IDebugExpressionEvaluator::GetMethodProperty die folgenden Aufgaben aus:

  1. Ruft GetContainerField auf, und übergibt das IDebugAddress -Objekt. Der Symbolanbieter (SP) gibt ein IDebugContainerField zurück, das die Methode darstellt, die die angegebene Adresse enthält.

  2. Ruft das IDebugMethodField aus dem IDebugContainerField.

  3. Instanziiert eine Klasse (in diesem Beispiel aufgerufen CFieldProperty ), die die IDebugProperty2-Schnittstelle implementiert und das IDebugMethodField vom SP zurückgegebene Objekt enthält.

  4. Gibt die IDebugProperty2 Schnittstelle aus dem CFieldProperty-Objekt zurück.

Verwalteter Code

Dieses Beispiel zeigt eine Implementierung in IDebugExpressionEvaluator::GetMethodProperty verwaltetem Code.

namespace EEMC
{
    [GuidAttribute("462D4A3D-B257-4AEE-97CD-5918C7531757")]
    public class EEMCClass : IDebugExpressionEvaluator
    {
        public HRESULT GetMethodProperty(
                IDebugSymbolProvider symbolProvider,
                IDebugAddress        address,
                IDebugBinder         binder,
                int                  includeHiddenLocals,
            out IDebugProperty2      property)
        {
            IDebugContainerField containerField = null;
            IDebugMethodField methodField       = null;
            property = null;

            // Get the containing method field.
            symbolProvider.GetContainerField(address, out containerField);
            methodField = (IDebugMethodField) containerField;

            // Return the property of method field.
            property = new CFieldProperty(symbolProvider, address, binder, methodField);
            return COM.S_OK;
        }
    }
}

Nicht verwalteter Code

Dieses Beispiel zeigt eine Implementierung in IDebugExpressionEvaluator::GetMethodProperty nicht verwalteten Code.

[CPP]
STDMETHODIMP CExpressionEvaluator::GetMethodProperty(
        in IDebugSymbolProvider *pprovider,
        in IDebugAddress        *paddress,
        in IDebugBinder         *pbinder,
        in BOOL                  includeHiddenLocals,
        out IDebugProperty2    **ppproperty
    )
{
    if (pprovider == NULL)
        return E_INVALIDARG;

    if (ppproperty == NULL)
        return E_INVALIDARG;
    else
        *ppproperty = 0;

    HRESULT hr;
    IDebugContainerField* pcontainer = NULL;

    hr = pprovider->GetContainerField(paddress, &pcontainer);
    if (FAILED(hr))
        return hr;

    IDebugMethodField*    pmethod    = NULL;
    hr = pcontainer->QueryInterface( IID_IDebugMethodField,
            reinterpret_cast<void**>(&pmethod));
    pcontainer->Release();
    if (FAILED(hr))
        return hr;

    CFieldProperty* pfieldProperty = new CFieldProperty( pprovider,
                                                         paddress,
                                                         pbinder,
                                                         pmethod );
    pmethod->Release();
    if (!pfieldProperty)
        return E_OUTOFMEMORY;

    hr = pfieldProperty->Init();
    if (FAILED(hr))
    {
        pfieldProperty->Release();
        return hr;
    }

    hr = pfieldProperty->QueryInterface( IID_IDebugProperty2,
            reinterpret_cast<void**>(ppproperty));
    pfieldProperty->Release();

    return hr;
}