"Эта функция требует оценки всех потоков" после `new AdhocWorkspace()` в пользовательском визуализаторе VS
Я пытаюсь написать визуализатор, который отображает выражения в дереве выражений на узлы синтаксиса Roslyn, чтобы генерировать код для дерева выражений. Часть генерации синтаксического дерева - это вызов 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);
}
}
}
Но когда я пытаюсь использовать визуализатор через пользовательский интерфейс Visual Studio (при наведении expr
, нажав на значок увеличительного стекла и выбрав мой визуализатор), я получаю следующее сообщение:
Невозможно выполнить оценку функции в отлаживаемом процессе.
Дополнительная информация
Оценка функции требует запуска всех потоков.
Я определил следующее как инициирующее ошибку:
workspace = new AdhocWorkspace();
который присваивает workspace
поле на моем Mapper
класс ( источник).
Почему звонит 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 ответ
Возможно, AdhocWorkspace
Альтернативный конструктор может быть использован для использования API-интерфейса SyntaxNode в одном потоке.
Я подал вопрос.