“此功能需要的所有主题,以评估”新AdhocWorkspace(后`)`VS定制的可视化内

问题描述 投票:1回答:1

我想写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,点击放大镜图标,选择我的可视化),以通过使用Visual Studio的用户界面可视化,我得到以下信息:

无法在执行过程中功能评价正在调试。

附加信息

该功能评价要求所有线程运行。

我已经确定了以下为触发错误:

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);
        }
    }
}
c# visual-studio roslyn debuggervisualizer
1个回答
0
投票

也许AdhocWorkspace alternate constructor可以被利用来使用SyntaxNode API在一个单独的线程。

我已提起issue

© www.soinside.com 2019 - 2024. All rights reserved.