Udostępnij za pośrednictwem


Implementowanie właściwości GetMethodProperty

Ważne

W programie Visual Studio 2015 ten sposób implementowania ewaluatorów wyrażeń jest przestarzały. Aby uzyskać informacje na temat implementowania ewaluatorów wyrażeń CLR, zobacz clR expression evaluators and Managed expression evaluator sample (Przykład ewaluatora wyrażeń zarządzanych).

Program Visual Studio wywołuje właściwość GetDebugProperty aparatu debugowania, która z kolei wywołuje właściwość GetMethodProperty w celu uzyskania informacji o bieżącej metodzie na ramce stosu.

Ta implementacja wykonuje IDebugExpressionEvaluator::GetMethodProperty następujące zadania:

  1. Wywołuje metodę GetContainerField, przekazując obiekt IDebugAddress. Dostawca symboli (SP) zwraca pole IDebugContainerField reprezentujące metodę zawierającą określony adres.

  2. Uzyskuje pole IDebugMethodField z obiektu IDebugContainerField.

  3. Tworzy wystąpienie klasy (nazywanej CFieldProperty w tym przykładzie), która implementuje interfejs IDebugProperty2 i zawiera IDebugMethodField obiekt zwrócony z sp.

  4. IDebugProperty2 Zwraca interfejs z CFieldProperty obiektu .

Kod zarządzany

W tym przykładzie pokazano implementację kodu zarządzanego IDebugExpressionEvaluator::GetMethodProperty .

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;
        }
    }
}

Niezarządzany kod

W tym przykładzie pokazano implementację IDebugExpressionEvaluator::GetMethodProperty kodu niezarządzanego.

[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;
}