遵循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命名空间的情况下工作?
发布于 2014-07-15 05:14:19
您应该将MyType放在单独的程序集中,就像在真实场景中一样,并尝试此版本的属性:
[assembly: DebuggerVisualizer(
typeof(TestVisualizer.Visualizer1),
TargetTypeName = "MyType.SomeType, NAMEOFTHEASSEMBLYCONTAININGSOMETYPE",
Description = "Just a test Visualizer")]不要忘记将NAMEOFTHEASSEMBLYCONTAININGSOMETYPE替换为程序集的名称(不要使用.dll文件扩展名!)。
发布于 2014-07-15 06:44:14
好吧,我终于解决了我自己的问题。事实证明,我的实际应用程序与我在这里发布的应用程序略有不同。在我最初的应用程序中,SomeType实际上是ISomeType (一个接口)。显然,DebugVisualizers不支持接口(至少不支持我使用的语法)。当我选择一个抽象基类作为我的目标类型时,一切都开始像广告中所说的那样工作。
https://stackoverflow.com/questions/24744597
复制相似问题