«Эта функция требует оценки всех потоков» после `new AdhocWorkspace ()` в пользовательском визуализаторе VS - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь написать визуализатор, который отображает выражения в дереве выражений на узлы синтаксиса 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 ( 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 Ответ

0 голосов
/ 09 февраля 2019

Возможно, альтернативный конструктор AdhocWorkspace можно использовать для использования API-интерфейса SyntaxNode в одном потоке.

Я подал номер .

...