Добавить новый проект в решение в рамках рефакторинга - PullRequest
0 голосов
/ 06 ноября 2018

Есть ли способ добавить новый проект в решение из CodeAction класса?

Контекст:

У меня есть CodeRefactoringProvider, который генерирует некоторый код, и я хочу поместить этот код в новый проект.

У меня есть CodeRefactoringProvider и CodeAction, реализованные для этой цели, и я пытаюсь добавить проект из экземпляра Solution, который я получаю из CodeRefactoringContext, например

 context.RegisterRefactoring(
            CodeAction.Create("Create New Project",
            (c)=>                
                Task.Run( 
                    ()=>
                    {
                        var proj = context.Document.Project.Solution.AddProject("NewProject", "NewProject", "C#");
                        return proj.Solution;
                    })           
            ));

Это дает мне

    System.AggregateException : One or more errors occurred. ---> Adding projects is not supported.
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout,CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Editor.Implementation.Suggestions.SuggestedAction.InvokeWorker(Func`1 getFromDocument,IProgressTracker progressTracker,CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Editor.Implementation.Suggestions.SuggestedAction.<>c__DisplayClass18_0.<InvokeCore>b__0()
   at Microsoft.CodeAnalysis.Extensions.IExtensionManagerExtensions.PerformAction(IExtensionManager extensionManager,Object extension,Action action)
---> (Inner Exception #0) System.NotSupportedException : Adding projects is not supported.
   at Microsoft.CodeAnalysis.Workspace.CheckAllowedSolutionChanges(SolutionChanges solutionChanges)
   at Microsoft.CodeAnalysis.Workspace.TryApplyChanges(Solution newSolution,IProgressTracker progressTracker)
   at Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem.VisualStudioWorkspaceImpl.TryApplyChanges(Solution newSolution,IProgressTracker progressTracker)
   at Microsoft.CodeAnalysis.CodeActions.ApplyChangesOperation.TryApply(Workspace workspace,IProgressTracker progressTracker,CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Editor.Implementation.CodeActions.CodeActionEditHandlerService.ProcessOperations(Workspace workspace,ImmutableArray`1 operations,IProgressTracker progressTracker,CancellationToken cancellationToken)
   at async Microsoft.CodeAnalysis.Editor.Implementation.CodeActions.CodeActionEditHandlerService.ApplyAsync(<Unknown Parameters>)<---

Я пытался добавить проект, используя сервис IVsSolution, но получил ошибку:

 The operation could not be completed. A null reference pointer was passed to the stub. 

Итак, как я могу создать новый проект в решении?

1 Ответ

0 голосов
/ 14 ноября 2018

На самом деле вам нужно манипулировать пользовательским интерфейсом VS, а не файлом решения или его представлением (context.Document). В противном случае, я ожидаю, что вам нужно будет вручную манипулировать всеми известными функциями «сначала сохранить изменения». Что сложного.

Поэтому вы должны вызывать методы VS UI (имеется в виду COM): Solution2.AddFromFile(String, Boolean)

https://docs.microsoft.com/en-us/dotnet/api/envdte80.solution2.addfromfile?view=visualstudiosdk-2017#EnvDTE80_Solution2_AddFromFile_System_String_System_Boolean_

Этот вызов будет работать как macro , и кажется, что вы ожидаете.

...