Search code examples
visual-studio-debuggingvisual-studio-extensions

How to implement IDkmCustomVisualizer for managed target


So far I was able to run and this sample that implement this interface and using it for debug C++ apps. I try to implement IDkmCustomVisualizer in C#, aiming use it to debug CLR apps. Is this possible ? I retrofitted Hello Wrold sample, where added class that implement IDkmCustomVisualizer and changed HelloWorld.vsdconfigxml. But nothing works, debugger in experimental instance do not use this implementation. Tried with VS 2017 and 2019 Community.

my IDkmCustomVisualizer implementation:

public class CSF : IDkmCustomVisualizer
{
    void crf()
    {
        System.IO.File.Delete("c:/uuu.txt");
        System.IO.File.WriteAllText("c:/uuu.txt", "ooo");
    }

    void IDkmCustomVisualizer.EvaluateVisualizedExpression(DkmVisualizedExpression visualizedExpression, out DkmEvaluationResult resultObject)
    {
        crf();
        visualizedExpression.EvaluateVisualizedExpression(out resultObject);
    }

    void IDkmCustomVisualizer.UseDefaultEvaluationBehavior(DkmVisualizedExpression visualizedExpression, out bool useDefaultEvaluationBehavior, out DkmEvaluationResult defaultEvaluationResult)
    {
        crf();
        visualizedExpression.UseDefaultEvaluationBehavior(out useDefaultEvaluationBehavior, out defaultEvaluationResult);
    }

    void IDkmCustomVisualizer.GetChildren(DkmVisualizedExpression visualizedExpression, int initialRequestSize, DkmInspectionContext inspectionContext, out DkmChildVisualizedExpression[] initialChildren, out DkmEvaluationResultEnumContext enumContext)
    {
        crf();
        visualizedExpression.GetChildren(initialRequestSize, inspectionContext, out initialChildren, out enumContext);
    }

    void IDkmCustomVisualizer.GetItems(DkmVisualizedExpression visualizedExpression, DkmEvaluationResultEnumContext enumContext, int startIndex, int count, out DkmChildVisualizedExpression[] items)
    {
        crf();
        visualizedExpression.GetItems(enumContext, startIndex, count, out items);
    }

    void IDkmCustomVisualizer.SetValueAsString(DkmVisualizedExpression visualizedExpression, string value, int timeout, out string errorText)
    {
        crf();
        visualizedExpression.SetValueAsString(value, timeout, out errorText);
    }

    string IDkmCustomVisualizer.GetUnderlyingString(DkmVisualizedExpression visualizedExpression)
    {
        crf();
        var ret = visualizedExpression.GetUnderlyingString();
        return ret;
    }
}

and HelloWorld.vsdconfigxml

<?xml version="1.0" encoding="utf-8"?>

<Configuration xmlns="http://schemas.microsoft.com/vstudio/vsdconfig/2008">

  <ManagedComponent
    ComponentId="C4256689-AC45-4B10-BFD3-4036CEE1863A"
    ComponentLevel="9992000"
    AssemblyName="HelloWorld">

    <Class Name="HelloWorld.CSF" >

      <Implements>
        <InterfaceGroup>
          <NoFilter></NoFilter>
          <Interface Name="IDkmCustomVisualizer"/>
        </InterfaceGroup>
      </Implements>
    </Class>

  </ManagedComponent>
</Configuration>

Thanks in advance


Solution

  • Pierson's advice for analyze logs was helpful, and finally I was able to run IDkmCustomVisualizer implemented in C# but only for debugging C++ apps. For managed apps it is not called. Found good alternative IDkmLanguageExpressionEvaluator that implemented in C# is called by both managed and unmagaged (C++) apps.