public AppDialog() { InitializeComponent(); ViewModel = new MainViewModel(); }
internal void CreateSolution(MainViewModel mainViewModel) { var model = mainViewModel.SelectedTemplate; var company = mainViewModel.Company; var solutionName = mainViewModel.SolutionName; if (model == null) { return; } var registryPath = String.Format(Environment.Is64BitOperatingSystem ? @"Software\Wow6432Node\Microsoft\VisualStudio\{0}" : @"Software\Microsoft\VisualStudio\{0}", DTE.Version); var registryKey = Registry.LocalMachine.OpenSubKey(registryPath); if (registryKey == null) { return; } var installDir = registryKey.GetValue("InstallDir"); var solution = DTE.Solution as Solution4; if (solution == null) { return; } string solutionFileName; if (solution.IsOpen) { solution.Close(); } var properties = DTE.Properties["Environment", "ProjectsAndSolution"]; var setting = properties.Item("ProjectsLocation"); if (setting != null && setting.Value != null) { var targetDir = Path.Combine(setting.Value.ToString(), solutionName); if (!Directory.Exists(targetDir)) { Directory.CreateDirectory(targetDir); } solutionFileName = Path.Combine(targetDir, String.Format("{0}.sln", solutionName)); solution.Create(targetDir, solutionName); solution.SaveAs(solutionName); } else { return; } var projects = new Dictionary<Guid, Tuple<Project, string, ICollection<Guid>, ICollection<string>>>(); DTE.Events.SolutionEvents.ProjectAdded += project => { var item = projects.SingleOrDefault(x => x.Value.Item2 == project.Name); if (projects.ContainsKey(item.Key)) { projects[item.Key] = new Tuple<Project, string, ICollection<Guid>, ICollection<string>>(project, item.Value.Item2, item.Value.Item3, item.Value.Item4); } }; // Create Folders & Projects foreach (var folder in model.Folders) { var solutionFolder = (SolutionFolder)solution.AddSolutionFolder(folder.Name).Object; foreach (var project in folder.Projects) { var fullProjectName = String.Format("{0}.{1}.{2}", company, solutionName, project.Name); var projectFolder = Path.Combine(Path.GetDirectoryName(DTE.Solution.FullName), fullProjectName); if (Directory.Exists(projectFolder)) { continue; } projects.Add(project.Id, new Tuple<Project, string, ICollection<Guid>, ICollection<string>>(null, fullProjectName, project.References, project.Packages)); var csTemplate = project.IsFindTemplate ? solution.GetProjectTemplate(project.TemplatePath, project.Language) : String.Format(project.TemplatePath, installDir); solutionFolder.AddFromTemplate(csTemplate, projectFolder, fullProjectName); } } // Create Projects - without folders foreach (var project in model.Projects) { var fullProjectName = String.Format("{0}.{1}.{2}", company, solutionName, project.Name); var projectFolder = Path.Combine(Path.GetDirectoryName(DTE.Solution.FullName), fullProjectName); if (Directory.Exists(projectFolder)) { continue; } projects.Add(project.Id, new Tuple<Project, string, ICollection<Guid>, ICollection<string>>(null, fullProjectName, project.References, project.Packages)); var csTemplate = project.IsFindTemplate ? solution.GetProjectTemplate(project.TemplatePath, project.Language) : String.Format(project.TemplatePath, installDir); solution.AddFromTemplate(csTemplate, projectFolder, fullProjectName); } // Reference the Projects foreach (var project in projects) { var vsProject = project.Value.Item1; var solutionProject = vsProject.Object as VSProject; InstallNugetPackages(vsProject, project.Value.Item4); if (solutionProject != null) { var references = projects.Where(x => project.Value.Item3.Contains(x.Key)).Select(x => x.Value.Item1); foreach (var reference in references) { solutionProject.References.AddProject(reference); } } vsProject.Save(); } solution.SaveAs(solutionFileName); }