2016-01-06 2 views
1

У меня есть расширения Visual Studio, которые используют Roslyn, чтобы получить проект в текущем открытом решении, скомпилировать его и запустить из него методы. Проект может быть изменен программистом.Как отлаживать код, скомпилированный с Roslyn в расширении Visual Studio внутри текущего хоста Visual Studio?

Я успешно скомпилировал проект в расширении Visual Studio из текущего VisualStudioWorkspace.

private static Assembly CompileAndLoad(Compilation compilation) 
    { 
     using (MemoryStream dllStream = new MemoryStream()) 
     using (MemoryStream pdbStream = new MemoryStream()) 
     { 
      EmitResult result = compilation.Emit(dllStream, pdbStream); 

      if (!result.Success) 
      { 
       IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic => 
        diagnostic.IsWarningAsError || 
        diagnostic.Severity == DiagnosticSeverity.Error); 

       string failuresException = "Failed to compile code generation project : \r\n"; 

       foreach (Diagnostic diagnostic in failures) 
       { 
        failuresException += $"{diagnostic.Id} : {diagnostic.GetMessage()}\r\n"; 
       } 

       throw new Exception(failuresException); 
      } 
      else 
      { 

       dllStream.Seek(0, SeekOrigin.Begin); 
       return AppDomain.CurrentDomain.Load(dllStream.ToArray(), pdbStream.ToArray()); 

      } 
     } 
    } 

Затем я могу загрузить сборку в текущем домене, получить его типы и вызвать методы.

Проблема в том, что я должен позволить программисту установить точки останова, если текущая конфигурация загруженного решения отлаживается.

Мне нужно запустить код в текущем хосте Visual Studio из расширения и разрешить его отладку в текущем экземпляре Visual Studio.

ответ

1

Вы должны прикрепить отладчик к текущему хосту визуальной студии. Для этого вам необходимо:

  1. Get hold of the DTE object,
  2. найти (текущий) процесс в DTE.Debugger.LocalProcesses
  3. Attach отладчика - example
  4. метод запуска из скомпилированной сборки

Вы Возможно, вам нужна отдельная команда/кнопка для этого, не просто включайте текущую конфигурацию сборки. Вот как это делают все остальные (например, тестовые бегуны и даже Visual Studio). Также загрузите скомпилированный Assembly в новый AppDomain, иначе он будет придерживаться for ever.

Там также более «творческое» решение нагнетания System.Diagnostics.Debugger.Launch() вызова методы который вы собираетесь запустить (изменить правильный Compilation.SyntaxTrees перед вызовом Emit) - но серьезно, не делает этого.

Смежные вопросы