roslynUsando espacios de trabajo

Introducción

El espacio de trabajo es una representación programática de la jerarquía de C # que consta de una solución, proyectos secundarios y documentos secundarios.

Observaciones

  • Actualmente no hay un espacio de trabajo de MSBuild que admita proyectos compatibles con .NET Standard. Para más información ver aquí .

Creando un AdhocWorkspace y agregándole un nuevo proyecto y un archivo.

La idea detrás de AdhocWorkspace es crear un espacio de trabajo sobre la marcha.

var workspace = new AdhocWorkspace();

string projectName = "HelloWorldProject";
ProjectId projectId = ProjectId.CreateNewId();
VersionStamp versionStamp = VersionStamp.Create();
ProjectInfo helloWorldProject = ProjectInfo.Create(projectId, versionStamp, projectName, projectName, LanguageNames.CSharp);
SourceText sourceText = SourceText.From("class Program { static void Main() { System.Console.WriteLine(\"HelloWorld\"); } }");

Project newProject = workspace.AddProject(helloWorldProject);
Document newDocument = workspace.AddDocument(newProject.Id, "Program.cs", sourceText);

Crear un MSBuildWorspace, cargar una solución y obtener todos los documentos en toda esa solución

MSBuildWorspace se basa en el concepto de manejo de soluciones MSBuild (archivos .sln ) y sus respectivos proyectos ( .csproj , .vbproj ). No se admite la adición de nuevos proyectos y documentos a este espacio de trabajo.

string solutionPath = @"C:\Path\To\Solution\Sample.sln";

MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution solution = await workspace.OpenSolutionAsync(nancyApp);

var allDocumentsInSolution = solution.Projects.SelectMany(x => x.Documents);

Obtención de VisualStudioWorkspace desde una extensión de Visual Studio

A diferencia de los otros tipos de espacios de trabajo, VisualStudioWorkspace no se puede crear manualmente. Se puede acceder al construir una extensión de Visual Studio.

Cuando [YourVSPackage]Package.cs dentro de su proyecto de paquete de extensión, vaya al [YourVSPackage]Package.cs . Allí puedes adquirir el espacio de trabajo de dos maneras:

protected override void Initialize()
{ 
    // Additional code...

    var componentModel = (IComponentModel)this.GetService(typeof(SComponentModel));
    var workspace = componentModel.GetService<VisualStudioWorkspace>();
}

O utilizando MEF:

[Import(typeof(VisualStudioWorkspace))]
public VisualStudioWorkspace ImportedWorkspace { get; set; }

Un excelente video tutorial sobre VisualStudioWorkspace , se puede encontrar aquí .