我正在尝试创建一个调试可视化器,它适用于各种对象,而不会使可视化器程序集成为依赖项。我想将此可视化器应用于各种类,包括私有嵌套类、内部类以及涉及许多复杂的泛型(父类和嵌套类)。这意味着我正在创建一个只包含关键数据的代理对象。
我不希望我的主程序集依赖于可视化器程序集,并且我不希望可视化器程序集了解主程序集的内容。
在主程序集中,我有一些看起来像这样的东西:
namespace MainAsm
{
public interface IVisualizable
{
DebugProxy DebugVisualizer { get; }
}
[Serializable]
public class DebugProxy
{
// data required for visualization here
public DebugProxy() { }
public DebugProxy(IVisualizable source)
{
var orig = source.DebugVisualizer;
// copy properties from orig
}
}
}
然后对于可视化工具,我的代码如下所示:
[assembly:System.Diagnostics.DebuggerVisualizer(
typeof(dbg.Visualizer),
typeof(Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource),
TargetTypeName="MainAsm.DebugProxy, MainAsm",
Description="MainAsm Debug Visualizer")]
namespace dbg
{
public class Visualizer : Microsoft.VisualStudio.DebuggerVisualizers.DialogDebuggerVisualizer
{
protected override void Show(
Microsoft.VisualStudio.DebuggerVisualizers.IDialogVisualizerService windowService,
Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider objectProvider)
{
object data = objectProvider.GetObject();
if (data == null)
return;
var t = data.GetType();
var prop = t.GetProperty("DebugVisualizer");
if (prop != null)
{
data = prop.GetValue(data, null) ?? data;
}
// use reflection to grab additional properties and open a window
}
}
}
我希望能够将可视化器应用于任何知道如何创建 DebugProxy 的类。如果我展开一个对象并单击其 DebugVisualizer 属性,我显然可以获得一个可视化工具,但我希望可视化与顶级对象相关联。所以,如果我有这样的事情:
[System.Diagnostics.DebuggerVisualizer(???)]
public class MyClass<TThis, T2, T3> : IVisualizable
where TThis : MyClass<TThis, T2, T3>, new()
where T2 : SomeOtherClass2<T2, T3>, new()
where T3 : SomeOtherClass3<T2, T3>, new()
{
DebugProxy IVisualizable.DebugVisualizer { get { return CreateProxy(); } }
}
问题是,我需要用什么代替 ??? 让它将可视化器与 MyClass<,,> 及其后代相关联?
--
- 如果我输入[System.Diagnostics.DebuggerTypeProxy(typeof(DebugProxy))] DebugProxy 不会显示可视化图标
- 如果我输入[System.Diagnostics.DebuggerVisualizer("dbg.Visualizer")] ,我会在 Microsoft.VisualStudio.DebuggerVisualizers.DebugViewerShim.ManagedShim.DelegateHost.CreateViewer获得NullReferenceException
- 如果我输入[System.Diagnostics.DebuggerVisualizer("dbg.Visualizer, dbg")] ,即使日志在“Initial PrivatePath =”下显示正确的路径,我也会得到“无法加载文件或程序集 dbg 或其依赖项之一”当它试图解析程序集时。
- 如果我把[System.Diagnostics.DebuggerVisualizer("dbg.Visualizer", "Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource")],我得到“无法创建 Visualizer 对象源。 ”调用堆栈是 DebuggerVisualizeres.DebugViewerShim 中的一系列方法命名空间:“DelegatedHost.CreateViewer”->“PrivateCallback.MaybeDeserializeAndthrowException”->“DebugeeHost.CreateSourceInternal”->“RemoteObjectSourceException”