/// <summary>
        /// Initializes a new instance of the <see cref="ProjectEventsDisabler"/> class.
        /// </summary>
        /// <param name="project">The project.</param>
        public ProjectEventsDisabler(IVsSolutionExplorer solutionManager, string projectName)
        {
            Guard.ArgumentNotNull(solutionManager, "solutionManager");
            Guard.ArgumentNotNullOrEmptyString(projectName, "projectName");

            _solutionManager = solutionManager;
            _solutionManager.DisableReferenceEventsOnProject(projectName);
        }
        /// <summary>
        /// Creates the project.
        /// </summary>
        /// <param name="solutionManager"></param>
        /// <param name="solutionFolderPath"></param>
        /// <param name="name">The name.</param>
        /// <param name="template">The template.</param>
        /// <param name="defaultTemplate"></param>
        /// <returns></returns>
        public ProjectNode CreateProject(IVsSolutionExplorer solutionManager, string projectTemplatesFolder, string solutionFolderPath, string name, string assemblyName, string template, string defaultNamespace, string solutionName)
        {
            Guard.ArgumentNotNull(solutionManager, "solutionManager");
            Guard.ArgumentNotNullOrEmptyString(name, "name");
            Guard.ArgumentNotNullOrEmptyString(template, "template");
            Guard.ArgumentNotNullOrEmptyString(solutionName, "solutionName");

            Solution2 sln = this.ExtObject as Solution2;
            if (sln == null)
                return null;

            var projectName = name;
            var projectDirectory = name;
            name = name.Replace(@"\", "/");
            var pos = name.LastIndexOf('/');
            if (pos >= 0)
            {
                projectDirectory = name.Substring(0, pos);
                projectName = name.Substring(pos + 1);
            }

            if (projectName.Length == 0)
                throw new Exception("Invalid project name");

            //var node = RecursiveFindByName(projectName);
            //if (node != null && node.IsProject)
            //    return node.CastToProjectNode();

            string templatePath = template;

            try
            {
                // TODO using (ProjectEventsDisabler disabler = new ProjectEventsDisabler(solutionManager, name))
                {
                    EnvDTE.Project p;
                    string projectFolder = System.IO.Path.Combine(ProjectDir, projectDirectory);
                    HierarchyNode hierarchyNode = RecursiveFindByName(projectName);
                    ProjectNode projectNode = null;
                    if (hierarchyNode != null && hierarchyNode.IsProject)
                        projectNode = hierarchyNode.CastToProjectNode();

                    if (projectNode == null)
                    {
                        // --------------------------------------------------------------
                        // Résolution du template

                        // Si le chemin n'est pas absolu
                        if (!System.IO.Path.IsPathRooted(templatePath))
                        {
                            // Recherche dans les templates VisualFabric
                            templatePath = projectTemplatesFolder != null ? System.IO.Path.Combine(projectTemplatesFolder, template) : template;
                            if (!File.Exists(templatePath))
                            {
                                // Recherche d'abord dans les templates de l'utilisateur
                                templatePath = System.IO.Path.Combine(solutionManager.GetExportedProjectTemplatesDir(), template);
                                if (!File.Exists(templatePath))
                                {
                                    // Sinon dans les templates standards
                                    string wizardName = template.Replace("\\", "/");

                                    string lang = null;
                                    pos = wizardName.LastIndexOf('/');
                                    if (pos >= 0)
                                    {
                                        lang = wizardName.Substring(0, pos);
                                        wizardName = wizardName.Substring(pos + 1);
                                    }
                                    try
                                    {
                                        templatePath = sln.GetProjectTemplate(wizardName, lang);
                                    }
                                    catch
                                    {
                                        throw new Exception(String.Format("Incorrect template name {0}", template));
                                    }
                                }
                            }
                        }

                        // Décompression du fichier dans un répertoire temporaire
                        templatePath = ExtractProjectItemInTemporaryFolder(templatePath, projectName, defaultNamespace, solutionName);
                        if (templatePath == null || !File.Exists(templatePath))
                            throw new Exception("Invalid project template " + template);

                        if (!String.IsNullOrEmpty(solutionFolderPath))
                        {
                            EnvDTE80.SolutionFolder container = CreateSolutionFolder(solutionFolderPath).Object as EnvDTE80.SolutionFolder;
                            container.AddFromTemplate(templatePath, projectFolder, projectName);
                            p = container.Parent.ProjectItems.Item(container.Parent.ProjectItems.Count).Object as EnvDTE.Project;
                        }
                        else
                        {
                            Utils.RemoveDirectory(projectFolder);
                            sln.AddFromTemplate(templatePath, projectFolder, projectName, false);
                            p = sln.Projects.Item(sln.Projects.Count);
                        }
                    }
                    else
                    {
                        p = projectNode.Project;
                    }

                    if (p != null)
                    {
                        if (!String.IsNullOrEmpty(defaultNamespace))
                        {
                            try
                            {
                                p.Properties.Item("DefaultNamespace").Value = defaultNamespace;
                            }
                            catch { /* projet web */ }
                        }
                        if (!String.IsNullOrEmpty(assemblyName))
                        {
                            try
                            {
                                p.Properties.Item("AssemblyName").Value = assemblyName;
                            }
                            catch { /* projet web */ }
                        }
                    }

                    return projectNode ?? new ProjectNode(Solution, p.UniqueName);
                }
            }
            finally
            {
                Utils.RemoveDirectory(System.IO.Path.GetDirectoryName(templatePath));
            }
        }