[英]VS2015 Watch LINQ var Error: The function evaluation requires all threads to run
[英]“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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.