private void projectItemGenerator_ProjectItemGenerated(object sender, ProjectItemGeneratedEventArgs e) { //.NET is a single-threaded application so we much release to let the UI refresh sometimes. if (_doEventCount % 10 == 0) { Application.DoEvents(); } _doEventCount++; try { const string solutionDirReplaceText = "$(solutiondir)"; if (e.FullName != null && e.FullName.ToLower().Contains(solutionDirReplaceText)) { var ti = e.FullName.ToLower().IndexOf(solutionDirReplaceText); e.FullName = e.FullName.Remove(ti, solutionDirReplaceText.Length).Insert(ti, EnvDTEHelper.Instance.SolutionDirectory.FullName); } if (e.ProjectItemName != null && e.ProjectItemName.ToLower().Contains(solutionDirReplaceText)) { var ti = e.ProjectItemName.ToLower().IndexOf(solutionDirReplaceText); e.ProjectItemName = e.ProjectItemName.Remove(ti, solutionDirReplaceText.Length).Insert(ti, EnvDTEHelper.Instance.SolutionDirectory.FullName); } //Get the parent project if one exists Project project = null; ProjectItem parent = null; if (!string.IsNullOrEmpty(e.ProjectName)) { if (projectCache.ContainsKey(e.ProjectName)) { var p = projectCache[e.ProjectName]; //Test this COM object to ensure it has not expired. //If error, do nothing and the project will be requeried try { var s = p.Name; project = p; } catch (Exception) { //Do Nothing projectCache.Remove(e.ProjectName); } } var fromCache = true; if (project == null) { fromCache = false; project = EnvDTEHelper.Instance.GetProject(e.ProjectName); projectCache.Add(e.ProjectName, project); } parent = EnvDTEHelper.Instance.GetProjectItem(e.ProjectName, e.ParentItemName, e.ParentItemType); //This should not happen. If do dump the cache project and requery if (parent == null && fromCache) { if (projectCache.ContainsKey(e.ProjectName)) { projectCache.Remove(e.ProjectName); } project = EnvDTEHelper.Instance.GetProject(e.ProjectName); projectCache.Add(e.ProjectName, project); parent = EnvDTEHelper.Instance.GetProjectItem(e.ProjectName, e.ParentItemName, e.ParentItemType); } } var fileStateInfo = new FileStateInfo(); ProjectItem projectItem = null; if (e.ParentItemName != string.Empty) { if (e.ContentType == ProjectItemContentType.String) { projectItem = EnvDTEHelper.Instance.AddProjectItem(project, parent, e.ProjectItemName, e.ProjectItemContent, e.Overwrite, out fileStateInfo); } else { projectItem = EnvDTEHelper.Instance.AddProjectItem(parent, e.ProjectItemContent, out fileStateInfo); } if (fileStateInfo.FileState == EnvDTEHelper.FileStateConstants.Success) { EnvDTEHelper.SetProperties(projectItem, e.Properties); } } else { if (e.ContentType == ProjectItemContentType.String || e.ContentType == ProjectItemContentType.Binary) { if (project == null) { EnvDTEHelper.Instance.AddProjectItem(e.ProjectItemContent, e.ProjectItemBinaryContent, e.ContentType, e.ProjectItemName, e.Overwrite, out fileStateInfo); } else { projectItem = EnvDTEHelper.Instance.AddProjectItem(project, e.ProjectItemContent, e.ProjectItemBinaryContent, e.ContentType, e.ProjectItemName, e.Overwrite, out fileStateInfo); } } else { projectItem = EnvDTEHelper.Instance.AddFileAsProjectItem(project, e.ProjectItemContent, e.ProjectItemName, e.Overwrite, out fileStateInfo); } if (fileStateInfo.FileState == EnvDTEHelper.FileStateConstants.Success) { EnvDTEHelper.SetProperties(projectItem, e.Properties); } } //TEMP processedFiles.Add(fileStateInfo.FileName); //TEMP //Custom Tool Functionality if (e.RunCustomTool && projectItem != null) { if (!string.IsNullOrEmpty(e.CustomToolName)) { EnvDTEHelper.SetProperty(projectItem, "Generator", e.CustomToolName); EnvDTEHelper.SetProperty(projectItem, "CustomTool", e.CustomToolName); } //Try to run the custom tool try { var vsProjectItem = projectItem.Object as VSLangProj.VSProjectItem; if (vsProjectItem != null) { vsProjectItem.RunCustomTool(); } } catch { //Do Nothing } } #region Compute CRC //System.IO.StreamReader sr = System.IO.File.OpenText(""); //nHydrate.Generator.Common.Util.CRC32HashAlgorithm hash = new CRC32HashAlgorithm(); //byte[] arr = hash.ComputeHash(sr.BaseStream); //sr.Close(); //XmlHelper.AddAttribute(newfileNode, "crc", "0"); #endregion if (fileStateInfo.FileName == string.Empty) { System.Diagnostics.Debug.Write(string.Empty); } if (fileStateInfo.FileState == EnvDTEHelper.FileStateConstants.Failed) { System.Diagnostics.Debug.Write(string.Empty); } //Write Log nHydrateLog.LogInfo("Project Item Generated: {0}", e.ProjectItemName); e.FileState = fileStateInfo.FileState; e.FullName = fileStateInfo.FileName; this.OnProjectItemGenerated(sender, e); } catch (Exception ex) { this.OnProjectItemGeneratedError(this, e); nHydrateLog.LogWarning(ex); } }