significado lyrics iver bon c# roslyn

c# - lyrics - roslyn ny



¿Cómo compilo una solución de C#con Roslyn? (2)

También quería compilar una solución completa sobre la marcha. Partiendo de la respuesta de Kevin Pilch-Bisson y del comentario de Josh E , escribí un código para compilarlo y escribirlo en archivos.

Software utilizado

Actualización 1 de Visual Studio Community 2015

Microsoft.CodeAnalysis v1.1.0.0 (Se instala mediante la Consola del Administrador de paquetes con el comando Install-Package Microsoft.CodeAnalysis ).

Código

using System; using System.Collections.Generic; using System.IO; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Emit; using Microsoft.CodeAnalysis.MSBuild; namespace Roslyn.TryItOut { class Program { static void Main(string[] args) { string solutionUrl = "C://Dev//Roslyn.TryItOut//Roslyn.TryItOut.sln"; string outputDir = "C://Dev//Roslyn.TryItOut//output"; if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } bool success = CompileSolution(solutionUrl, outputDir); if (success) { Console.WriteLine("Compilation completed successfully."); Console.WriteLine("Output directory:"); Console.WriteLine(outputDir); } else { Console.WriteLine("Compilation failed."); } Console.WriteLine("Press the any key to exit."); Console.ReadKey(); } private static bool CompileSolution(string solutionUrl, string outputDir) { bool success = true; MSBuildWorkspace workspace = MSBuildWorkspace.Create(); Solution solution = workspace.OpenSolutionAsync(solutionUrl).Result; ProjectDependencyGraph projectGraph = solution.GetProjectDependencyGraph(); Dictionary<string, Stream> assemblies = new Dictionary<string, Stream>(); foreach (ProjectId projectId in projectGraph.GetTopologicallySortedProjects()) { Compilation projectCompilation = solution.GetProject(projectId).GetCompilationAsync().Result; if (null != projectCompilation && !string.IsNullOrEmpty(projectCompilation.AssemblyName)) { using (var stream = new MemoryStream()) { EmitResult result = projectCompilation.Emit(stream); if (result.Success) { string fileName = string.Format("{0}.dll", projectCompilation.AssemblyName); using (FileStream file = File.Create(outputDir + ''//' + fileName)) { stream.Seek(0, SeekOrigin.Begin); stream.CopyTo(file); } } else { success = false; } } } else { success = false; } } return success; } } }

Tengo una pieza de software que genera código para un proyecto de C # basado en las acciones del usuario. Me gustaría crear una GUI para compilar automáticamente la solución para no tener que cargar Visual Studio solo para desencadenar una recompilación.

He estado buscando la oportunidad de jugar con Roslyn un poco y decidí intentar usar Roslyn en lugar de msbuild para hacer esto. Desafortunadamente, parece que no puedo encontrar buenos recursos sobre el uso de Roslyn de esta manera.

¿Alguien puede señalarme en la dirección correcta?


Puede cargar la solución utilizando Roslyn.Services.Workspace.LoadSolution . Una vez que lo haya hecho, debe revisar cada uno de los proyectos en orden de dependencia, obtener la Compilation del proyecto y llamar a Emit .

Puede obtener las compilaciones en orden de dependencia con el código como abajo. (Sí, sé que tener que lanzar a IHaveWorkspaceServices apesta. Será mejor en el próximo lanzamiento público, lo prometo).

using Roslyn.Services; using Roslyn.Services.Host; using System; using System.Collections.Generic; using System.IO; class Program { static void Main(string[] args) { var solution = Solution.Create(SolutionId.CreateNewId()).AddCSharpProject("Foo", "Foo").Solution; var workspaceServices = (IHaveWorkspaceServices)solution; var projectDependencyService = workspaceServices.WorkspaceServices.GetService<IProjectDependencyService>(); var assemblies = new List<Stream>(); foreach (var projectId in projectDependencyService.GetDependencyGraph(solution).GetTopologicallySortedProjects()) { using (var stream = new MemoryStream()) { solution.GetProject(projectId).GetCompilation().Emit(stream); assemblies.Add(stream); } } } }

LoadSolution : LoadSolution todavía usa msbuild debajo de las cubiertas para analizar los archivos .csproj y determinar las opciones de archivos / referencias / compilador.

Nota2: Como Roslyn aún no tiene el idioma completo, es probable que haya proyectos que no se compilen correctamente cuando intente esto.