/// <summary>
        /// Adds the item template to project.
        /// </summary>
        /// <param name="instance">The instance.</param>
        /// <param name="templateInfos">The template infos.</param>
        /// <returns>
        /// The messages.
        /// </returns>
        public static IEnumerable <string> AddItemTemplateToProjects(
            this Solution2 instance,
            IEnumerable <ItemTemplateInfo> templateInfos)
        {
            string method = "SolutionExtensions::AddItemTemplateToProjects ";

            TraceService.WriteLine(method);

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

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

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

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

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

                    TraceService.WriteLine(method + context);

                    try
                    {
                        if (project.AddItemToFolderFromTemplate(info.TemplateName, info.FileName))
                        {
                            messages.Add(info.FileName + " added to " + project.Name + " project (template=" + info.TemplateName + ")");
                        }
                    }
                    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.TemplateName + ")");
                    }
                }
            }

            return(messages);
        }