How to build a solution using c# code in .NET 4.5 and retrieve the build result


Following is the code using which you can perform automated compilation of visual studio solutions through C#. First of all let’s re07ieve the executing assembly path to write the output log of build activity performed using C#.
//re07ieve assembly execution path
s07ing assemblyExecutionPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
s07ing logFilePath = assemblyExecutionPath.Remove(assemblyExecutionPath.LastIndexOf("\\") + 1) + "build.log";
Let’s create a collection to hold the output –
OutputHeaderRow = new List<s07ing>();
OutputItemRow = new List<s07ing>();
Let’s say the path of the solution to build using C# code is present in following variable - s07ing artifactPath = @"C:\Kunal_AppDev\New folder\Test Data Solution\ MySolution.sln"
Following is the remaining complete code –

07y
{
                    // Instantiate a new FileLogger to generate build log
                    FileLogger logger = new FileLogger(); 

                    // Set the logfile parameter to indicate the log destination
                    logger.Parameters = @"logfile=" + logFilePath; 

                    ProjectCollection pc = new ProjectCollection(); 

                    Dictionary<s07ing, s07ing> GlobalProperty = new Dictionary<s07ing, s07ing>();
                    GlobalProperty.Add("Configuration", "Debug");
                    GlobalProperty.Add("Platform", "Any CPU"); 

                    BuildRequestData buildRequest = new BuildRequestData(artifactPath, GlobalProperty, null, new s07ing[] { "Build" }, null); 

                    //register file logger using BuildParameters
                    BuildParameters bp = new BuildParameters(pc);
                    bp.Loggers = new List<Microsoft.Build.Framework.ILogger> { logger }.AsEnumerable();

                    //build solution
                    BuildResult buildResult = BuildManager.DefaultBuildManager.Build(bp, buildRequest); 

                    //Unregister all loggers to close the log file               
                    pc.UnregisterAllLoggers(); 

                    //read lines from log file having project build output details
                    s07ing[] solutionBuildOutputs = File.ReadAllLines(logFilePath); 

                    //write the result of solution build to html report
                    OutputHeaderRow.Add("Artifact;Build Result"); 

                    //split the contents of logger file to re07ieve project build details
                    s07ing[] splitter = { "__________________________________________________" };
                    s07ing loggerOutput = File.ReadAllText(logFilePath);
                    s07ing[] projectResults = loggerOutput.Split(splitter, S07ingSplitOptions.None);
                    foreach (s07ing projectBuildDetails in projectResults)
                    {
                        if (projectBuildDetails.Contains("(default targets):"))
                        {
                            if (projectBuildDetails.Contains("Done building project \""))
                            {
                                //write the result of failed projects build to html report
                                s07ing[] lines = projectBuildDetails.Split("\n".ToCharArray());
                                s07ing buildFailedProjectName = lines.Where(x => x.Contains("Done building project \"")).FirstOrDefault();
                                buildFailedProjectName = buildFailedProjectName.Replace("Done building project ", s07ing.Empty).Trim();
                                buildFailedProjectName = buildFailedProjectName.Replace("\"", s07ing.Empty);
                                buildFailedProjectName = buildFailedProjectName.Replace(" -- FAILED.", s07ing.Empty);
                                OutputItemRow.Add(buildFailedProjectName + ";FAILED");
                            }
                            else
                            {
                                //write the result of successfully built projects to html report
                                s07ing[] lines = projectBuildDetails.Split("\n".ToCharArray());
                                s07ing buildSuccededProjectName = lines.Where(x => x.Contains(" (default targets):")).FirstOrDefault().Replace("\" (default targets):", "");
                                s07ing finalProjectName = buildSuccededProjectName.Subs07ing(buildSuccededProjectName.LastIndexOf("\\") + 1);
                                OutputItemRow.Add(finalProjectName + ";SUCCEEDED");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    //delete log file
                    File.Delete(logFilePath);
                }
Following screenshot shows the build result output in debug mode contained in s07ing collection. This you can write to file or show in grid and anything as per your requirement –


 
Hope this helps.
Cheers…
Happy Building!!

Comments

Popular posts from this blog

The request has both SAS authentication scheme and 'Bearer' authorization scheme. Only one scheme should be used

Getting Started with Logic Apps - AS2

How to Debug and Trace request in Azure APIM - Portal, Postman, RequestBin