6

我编写了自己的调试器可视化工具。

它和属性都在它们自己的程序集中。包含要调试的类的程序集中没有引用或属性 - 我想制作一个可供人们使用的可选的插入式 dll。

我要调试的类是泛型的。

[Serializable]
public class FinCellTable<S> : IFinCellTable, IEnumerable<List<FinCell.IFinCell>>
    where S : class, FinCell.IFinHeaderCell, FinCell.IFinCell, new()

这是可视化工具:

[assembly: System.Diagnostics.DebuggerVisualizer(
        typeof(Financials.Debugging.CellTableVisualizer),
        typeof(VisualizerObjectSource),
        Target = typeof(Financials.Transformation.IFinCellTable),
        Description = "FinCell Table Visualizer")]
[assembly: System.Diagnostics.DebuggerVisualizer(
        typeof(Financials.Debugging.CellTableVisualizer),
        typeof(VisualizerObjectSource),
        Target = typeof(Financials.Transformation.FinCellTable<Financials.FinCell.FinHeaderCell>),
        Description = "FinCell Table Visualizer")]

namespace Financials.Debugging
{
    public class CellTableVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            if (windowService == null) throw new ArgumentNullException("windowService");
            if (objectProvider == null) throw new ArgumentNullException("objectProvider");

            var data = (IFinCellTable)objectProvider.GetObject();
            using (var displayForm = new CellTableVizForm())
            {
                displayForm.PopulateForm(data);
                windowService.ShowDialog(displayForm);
            }
        }
    }
}

我正在运行 Visual Studio 2010,以下目录包含 Visualizer 程序集的 .dll 和 .pdb:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\Visualizers

我在 IFinCellTable 的一个实例上放置了一个断点,该实例特别是 FinCellTable。它没有显示放大镜。

我使用另一个 Visual Studio 调试了 Visual Studio,因为第一个 VS 正在调试。我看着输出窗口作为第一个 VS 加载的 dll。当我在数据表上触发可视化工具时,第二个 VS 输出它加载了 Microsoft.VisualStudio.DebuggerVisualizers.dll 和 Microsoft.VisualStudio.Debugger.DataSetVisualizer.dll(后者来自我上面所说的正确目录)。(“模块”窗口的行为/显示相同。)

所以很明显我的Debugger Visualizer Drop-In程序集没有被VS加载,所以它不知道显示放大镜。

您如何让 Visual Studio 预先加载 Visualizer,以便插入式可视化器工作并且您无需编辑原始代码?

4

4 回答 4

3

疯狂猜测:您确定正确的文件在 中C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\Visualizers,而不是在 中C:\Users\<you>\AppData\Local\VirtualStore\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\Visualizers

如果是,那是由于UAC 虚拟化

于 2010-11-11T09:13:22.947 回答
1

这个问题已经超过 5 年了,所以我认为它不再与原始海报相关,但对于其他尝试做类似事情的人来说:

当目标是接口时,System.Diagnostics.DebuggerVisualizer 不起作用。您必须指定具体类型。您必须在要可视化的每个具体类型上指定属性:

[System.Diagnostics.DebuggerVisualizer("Financials.Debugging.CellTableVisualizer, Financials.Debugging, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...")]
[Serializable]
public class FinCellTable<S> : IFinCellTable, IEnumerable<List<FinCell.IFinCell>>
    where S : class, FinCell.IFinHeaderCell, FinCell.IFinCell, new()
{
于 2015-11-03T16:04:31.483 回答
0

我相信这可以在 Tools > Options 中禁用:如果您没有看到 DebuggerDisplay 或 DebuggerTypeProxy 的效果,请确保未选中 Tools > Options > Debugging > General > Show raw structure of objects in variables windows。

于 2011-01-16T17:16:11.750 回答
0

放置它的正确文件夹是:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Packages\Debugger\Visualizers。一旦你把这个DLL放在那里并重新启动Visual Studio,那么你应该在“表达式”类型的变量上得到一个“放大镜”(在调试模式下,你会在监视窗口中得到它,当你将鼠标光标移到变量上时也会得到它)

于 2014-10-22T19:32:22.517 回答