我编写了自己的Debugger Visualizer。
它和属性都在它们自己的程序集中。包含要调试的类的程序集中没有引用或属性 - 我想创建一个可供人们使用的drop-in 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
我在一个特别是FinCellTable的IFinCellTable实例上放置一个断点。它没有显示放大镜。
我使用另一个Visual Studio调试了Visual Studio,因为第一个VS正在调试。我看到输出窗口是第一个VS加载的dll。当我在数据表上触发可视化工具时,第二个VS输出它加载了Microsoft.VisualStudio.DebuggerVisualizers.dll和Microsoft.VisualStudio.Debugger.DataSetVisualizer.dll(后者来自我上面说的正确目录)。 (“模块”窗口的行为/显示相同。)
显然我的Debugger Visualizer Drop-In程序集不会被VS加载,因此它不知道显示放大镜。
如何让visual studio预先加载展示台,因此嵌入式可视化工具工作而您无需编辑原始代码?
答案 0 :(得分: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 Virtualization。
答案 1 :(得分:1)
这个问题已经超过5年了,所以我认为它与原始海报不再相关,但是对于其他试图做类似事情的人来说:
当target是接口时,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()
{
答案 2 :(得分:0)
我相信这可以在工具&gt;中禁用选项: 如果您没有看到DebuggerDisplay或DebuggerTypeProxy的影响,请确保Tools&gt;选项&gt;调试&gt;一般&gt;不检查变量窗口中对象的原始结构。
答案 3 :(得分:0)
放置它的正确文件夹是: C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ Packages \ Debugger \ Visualizers。一旦你把这个DLL放在那里并重新启动visual studio,那么你应该在“Expression”类型的变量上获得一个“放大镜”(在调试模式下,你将在观察窗口中获取它,当你将鼠标光标移动到变量上时)< / p>