簡體   English   中英

VS自定義可視化工具中的“ new AdhocWorkspace()”之后,“此函數需要所有線程進行評估”

[英]“This function requires all threads to evaluate” after `new AdhocWorkspace()` within VS custom visualizer

我正在嘗試編寫一個可視化工具, 以將表達式樹中的表達式映射到Roslyn語法節點 ,以便為表達式樹生成代碼。 語法樹生成的一部分是對AdhocWorkspace構造函數的調用。

當我使用VisualizerDevelopmentHost運行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);
        }
    }
}

但是,當我嘗試通過Visual Studio UI使用可視化工具時(將鼠標懸停在expr ,單擊放大鏡圖標並選擇我的可視化工具),會收到以下消息:

無法對正在調試的進程執行功能評估。

附加信息

函數評估要求所有線程都運行。

我已確定觸發錯誤的原因如下:

workspace = new AdhocWorkspace();

分配給我的Mapper類( )上的workspace字段。

為什么調用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);
        }
    }
}

也許可以利用AdhocWorkspace 備用構造函數在單個線程中使用SyntaxNode API。

我提了一個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM