为什么我无法注册DebuggerVisualizer? (在VS2012中)

时间:2014-07-14 19:43:34

标签: visual-studio-2012

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工作?

2 个答案:

答案 0 :(得分:1)

您应该将MyType放在单独的程序集中,就像在现实世界中一样,并尝试使用此版本的属性:

[assembly: DebuggerVisualizer(
    typeof(TestVisualizer.Visualizer1),
    TargetTypeName = "MyType.SomeType, NAMEOFTHEASSEMBLYCONTAININGSOMETYPE",
    Description = "Just a test Visualizer")]

不要忘记将NAMEOFTHEASSEMBLYCONTAININGSOMETYPE替换为程序集的名称(不要使用.dll文件扩展名!)。

答案 1 :(得分:0)

好吧,我终于找到了自己的问题。事实证明,我的真实应用程序与我在这里发布的应用程序略有不同。在我的原始应用程序中,SomeType实际上是ISomeType(接口)。显然,DebugVisualizers不支持接口(至少不支持我使用的语法)。当我选择一个抽象基类作为我的目标类型时,一切都开始像宣传的那样工作。