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

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

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

Я нашел qaru.site/info/9529/..., в котором предлагается использовать статическое свойство PrimaryWorkspace класса Workspace, которое я не могу найти в Microsoft.CodeAnalysis.Workspace

EDIT: Я узнал, что у Microsoft.CodeAnalysis этого пока нет, но я загрузил более старую версию Roslyn с Nuget.org, которая имеет это. Но теперь свойство PrimaryWorkspace дает мне NULL:( Я использую изолированную оболочку.

Ответ 1

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

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

Ответ 2

Внутри функции 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