代码之家  ›  专栏  ›  技术社区  ›  Zev Spitz

VS custom visualizer中`new AdhocWorkspace()`之后的“此函数要求所有线程求值”

  •  1
  • Zev Spitz  · 技术社区  · 7 年前

    maps expressions in an expression tree to Roslyn syntax nodes ,以便为表达式树生成代码。语法树生成的一部分是调用 AdhocWorkspace 构造器。

    VisualizerDevelopmentHost ,一切正常:

    using Microsoft.VisualStudio.DebuggerVisualizers;
    using System;
    using System.Linq.Expressions;
    
    namespace _testVisualizer {
        class Program {
            [STAThread]
            static void Main(string[] args) {
                Expression<Func<bool>> expr = () => true;
                var data = new TestVisualizerData(expr);
                var visualizerHost = new VisualizerDevelopmentHost(data, typeof(TestVisualizer));
                visualizerHost.ShowVisualizer();
    
                Console.ReadKey(true);
            }
        }
    }
    

    expr ,单击放大镜图标并选择我的可视化工具),我得到以下消息:

    无法对正在调试的进程执行功能评估。

    函数求值需要运行所有线程。

    我已确定以下因素触发了错误:

    workspace = new AdhocWorkspace();
    

    分配给 workspace 我的场地 Mapper source ).

    为什么打电话给警察 AdhocWorkspace 构造函数触发此警告?我怎样才能解决这个问题?


    这是一个演示问题的MCVE:

    using Microsoft.CodeAnalysis;
    using Microsoft.VisualStudio.DebuggerVisualizers;
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Windows;
    using System.Windows.Controls;
    
    [assembly: DebuggerVisualizer(typeof(_testVisualizer.TestVisualizer), typeof(_testVisualizer.TestVisualizerDataObjectSource), Target = typeof(System.Linq.Expressions.Expression), Description = "Test Visualizer")]
    
    namespace _testVisualizer {
        public class TestVisualizer : DialogDebuggerVisualizer {
            protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) {
                var data = (TestVisualizerData)objectProvider.GetObject();
                var txt = new TextBlock();
                txt.SetBinding(TextBlock.TextProperty, "Status");
                var window = new Window {
                    DataContext = data,
                    Content = txt
                };
                window.ShowDialog();
            }
        }
    
        [Serializable]
        public class TestVisualizerData {
            public TestVisualizerData() { }
            public TestVisualizerData(System.Linq.Expressions.Expression expr) {
                var workspace = new AdhocWorkspace();
                Status = "Success";
            }
            public string Status { get; set; }
        }
    
        public class TestVisualizerDataObjectSource : VisualizerObjectSource {
            public override void GetData(object target, Stream outgoingData) {
                var expr = (System.Linq.Expressions.Expression)target;
                var data = new TestVisualizerData(expr);
                base.GetData(data, outgoingData);
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Zev Spitz    7 年前

    也许是 AdhocWorkspace alternate constructor 可以在单个线程中使用SyntaxNode API。

    我已经提交了一份申请 issue .