/// <summary>
        /// Adds the text template to projects.
        /// </summary>
        /// <param name="instance">The instance.</param>
        /// <param name="textTemplateInfos">The text template infos.</param>
        /// <param name="outputTextTemplateContentToTraceFile">if set to <c>true</c> [output text template content to trace file].</param>
        /// <returns></returns>
        public static IEnumerable <string> AddTextTemplateToProjects(
            this Solution2 instance,
            IEnumerable <TextTemplateInfo> textTemplateInfos,
            bool outputTextTemplateContentToTraceFile)
        {
            string method = "SolutionExtensions::AddTextTemplateToProjects ";

            TraceService.WriteLine(method);

            List <string> messages = new List <string>();

            IEnumerable <Project> projects = instance.GetProjects();

            IEnumerable <Project> projectItems = projects as Project[] ?? projects.ToArray();

            foreach (TextTemplateInfo info in textTemplateInfos)
            {
                Project project = projectItems.FirstOrDefault(x => x.Name.EndsWith(info.ProjectSuffix));

                if (project != null)
                {
                    string context = project.Name + "  (template=" + info.ShortTemplateName + ") fileName=" + info.FileName;

                    TraceService.WriteLine(method + context);

                    try
                    {
                        instance.DTE.StatusBar.Text = "Adding Text Template to project " + project.Name;

                        if (project.AddTextTemplate(info.ProjectFolder, info.FileName, info.TextOutput, outputTextTemplateContentToTraceFile) != string.Empty)
                        {
                            messages.Add(info.FileName + " added to " + project.Name + " project (template=" + info.ShortTemplateName + ")");
                        }

                        if (info.ChildItems != null)
                        {
                            foreach (TextTemplateInfo childItem in info.ChildItems)
                            {
                                TraceService.WriteLine("Adding child Text Template projectFolder=" + childItem.ProjectFolder + " fileName=" + childItem.FileName);

                                try
                                {
                                    project.AddTextTemplate(
                                        childItem.ProjectFolder,
                                        childItem.FileName,
                                        childItem.TextOutput,
                                        outputTextTemplateContentToTraceFile);
                                }
                                catch (Exception exception)
                                {
                                    TraceService.WriteError(method + " Adding child Text Template exception=" + exception.Message);
                                    messages.Add(method + " Adding child Text Template exception=" + exception.Message);
                                }
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        TraceService.WriteError(method + context + " exception=" + exception.Message);
                        messages.Add(method + context + " exception=" + exception.Message);
                    }
                }
                else
                {
                    TraceService.WriteError(method + " cannot find project " + info.ProjectSuffix);

                    foreach (string projectName in projectItems
                             .Select(projectItem => projectItem.Name))
                    {
                        TraceService.WriteError(method + " project " + projectName);
                        messages.Add(info.FileName + " added to " + projectName + " project (template=" + info.ShortTemplateName + ")");
                    }
                }
            }

            return(messages);
        }