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:
Wywołuje metodę GetContainerField, przekazując obiekt IDebugAddress. Dostawca symboli (SP) zwraca pole IDebugContainerField reprezentujące metodę zawierającą określony adres.
Uzyskuje pole IDebugMethodField z obiektu
IDebugContainerField
.Tworzy wystąpienie klasy (nazywanej
CFieldProperty
w tym przykładzie), która implementuje interfejs IDebugProperty2 i zawieraIDebugMethodField
obiekt zwrócony z sp.IDebugProperty2
Zwraca interfejs zCFieldProperty
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;
}