Как получить ссылку на объект рабочего пространства Roslyn из IVsSolution?

У меня есть проект VS Package, из которого мне нужно получить доступ к объекту рабочей области Roslyn или Microsoft.CodeAnalysis ИЛИ Solution из загруженного IVsSolution.

Мне нужно знать, как я могу этого достичь?

Я нашел это обсуждение потока стека здесь, которое предлагает использовать статическое свойство PrimaryWorkspace класса Workspace, которое я не могу найти в Microsoft.CodeAnalysis.Workspace

РЕДАКТИРОВАТЬ: Я обнаружил, что Microsoft.CodeAnalysis еще не имеет этого, но я скачал более старую версию Roslyn с Nuget.org, которая имеет это. Но теперь свойство PrimaryWorkspace дает мне значение NULL:(Я использую изолированную оболочку.

2 ответа

VisualStudioWorkspace экспортируется через MEF. Если вы уже используете MEF в своем пакете, вы можете просто [Import] Это.

Если нет, вы можете QueryService() для SComponentModel обслуживание, а затем получить VisualStudioWorkspace От этого.

В функции Initialize() вашего VSPackage вы можете использовать следующее:

var componentModel = (IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel));
var workspace = componentModel.GetService<Microsoft.VisualStudio.LanguageServices.VisualStudioWorkspace>();

Я считаю, что вам также нужно добавить дополнительную ссылку на: Microsoft.VisualStudio.LanguageServices.dll

Как отмечает @Vizu, теперь вы можете добавить это через NuGet:

Install-Package Microsoft.VisualStudio.LanguageServices
Другие вопросы по тегам