如何为托管目标实现 IDkmCustomVisualizer

How to implement IDkmCustomVisualizer for managed target

到目前为止,我能够 运行 和 this sample 实现此接口并将其用于调试 C++ 应用程序。 我尝试在 C# 中实现 IDkmCustomVisualizer,旨在使用它来调试 CLR 应用程序。这可能吗 ? 我改造了 Hello Wrold sample,其中添加了实现 IDkmCustomVisualizer 的 class 并更改了 HelloWorld.vsdconfigxml。但是没有任何效果,实验实例中的调试器不使用此实现。尝试使用 VS 2017 和 2019 社区。

我的 IDkmCustomVisualizer 实现:

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

和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>

提前致谢

Pierson 关于分析日志的建议很有帮助,最后我能够 运行 IDkmCustomVisualizer 在 C# 中实现,但仅用于调试 C++ 应用程序。对于托管应用程序,它不会被调用。 找到了很好的替代 IDkmLanguageExpressionEvaluator,它在 C# 中实现,由托管和未管理 (C++) 应用程序调用。