在MSDN instructions之后,我创建了一个自定义DebuggerVisualizer,如下所示:
[assembly: DebuggerVisualizer(
typeof(TestVisualizer.Visualizer1),
typeof(VisualizerObjectSource),
Target = typeof(MyType.SomeType),
Description = "Just a test Visualizer")]
namespace TestVisualizer
{
public class Visualizer1 : DialogDebuggerVisualizer
{
protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
{
SomeType obj1 = (SomeType)objectProvider.GetObject();
using (Form displayForm = new Form())
{
... display code here ...
windowService.ShowDialog(displayForm);
}
}
}
}
其中目标类型在单独的程序集中定义,如下所示:
namespace MyType
{
[Serializable]
public class SomeType{... class definition...}
}
TestVisualizer项目将.dll(构建后)复制到所需目录:
C:\Users\[username]\Documents\Visual Studio 2012\Visualizers
然后我重新启动Visual Studio,在实例化SomeType对象后放置一个断点。但是没有显示可视化器(没有放大镜)。
但是,如果我这样装饰SomeType
类定义:
namespace MyType
{
[DebuggerVisualizer(typeof(TestVisualizer.Visualizer1))] //this method works
[Serializable]
public class SomeType{... class definition...}
}
一切都按预期工作,放大镜出现了。同样,如果我使用VisualizerDevelopmentHost
来显示它,它也可以正常工作,因此可视化器类本身似乎没有任何问题。我似乎没有正确地注册它。
在不修改MyType命名空间的情况下,我需要做些什么才能使Visualizer工作?
答案 0 :(得分:1)
您应该将MyType放在单独的程序集中,就像在现实世界中一样,并尝试使用此版本的属性:
[assembly: DebuggerVisualizer(
typeof(TestVisualizer.Visualizer1),
TargetTypeName = "MyType.SomeType, NAMEOFTHEASSEMBLYCONTAININGSOMETYPE",
Description = "Just a test Visualizer")]
不要忘记将NAMEOFTHEASSEMBLYCONTAININGSOMETYPE
替换为程序集的名称(不要使用.dll文件扩展名!)。
答案 1 :(得分:0)
好吧,我终于找到了自己的问题。事实证明,我的真实应用程序与我在这里发布的应用程序略有不同。在我的原始应用程序中,SomeType
实际上是ISomeType
(接口)。显然,DebugVisualizers不支持接口(至少不支持我使用的语法)。当我选择一个抽象基类作为我的目标类型时,一切都开始像宣传的那样工作。