以编程方式生成Visual Studio解决方案

我想在.net中编写一个向导,它以编程方式生成带有一些项目的Visual Studio解决方案。 我将有一个XML文件,其中包含需要包含在项目中的文件的详细信息,以及它们各自的获取路径和项目名称列表。 有什么方法可以实现这一点

那么Visual Studio SDK将是您的发展之路。 有些方法可以创建文件,我认为也可以基于项目模板进行项目。 例如,您可以创建一个新的“asp.net mvc”项目或类库。 你甚至可以创建自己的模板。

我很确定你只能在VS内部做到这一点。

否则,生成项目和sln文件生成xml文件没有错,这是最终它们是xml文件的好东西之一。 你只需要生成一些Projectd Guids,但我认为这将非常简单并且完全“合法”。

进步很好!

查看文本模板转换工具包(T4) 。 它非常可爱,并支持ASP.NET MVC中的一些文件生成。 Scott Hanselman有一篇关于这个主题的精彩介绍性文章 。

您可以使用一小段代码或脚本来完成此操作。 Visual Studio将为您填写大部分GUID …

我把这样的东西整理成一次性整理项目。 它不是100%完美,你最终可能会从代码处理项目名称的方式得到重复。 希望它会告诉你的方式。

我们在这里做的是设置解决方案文件的序言,然后插入每个解决方案(您需要Project类型guid,这里可以看到FAE,但不是Project自己的GUID,VS将在保存解决方案文件时插入)。 然后我们会为每个项目插入构建配置。 我为每个项目提供了大约12个配置(不同的发布和调试设置),但我在这里将其浓缩为两个。

static void Main(string[] args) { if(args.Count() != 2) { Usage(); return; } var rootDir = args[0]; var output = args[1]; var files = Directory.EnumerateFiles(rootDir, "*.*proj", SearchOption.AllDirectories); var configs = new StringBuilder(); var configDefs = new string[]{ ".Debug|Any CPU.ActiveCfg = Debug|Any CPU", ".Release|Any CPU.ActiveCfg = Release|Any CPU", "Other_configurations_see_solution_for_how" }; using(var sw = new StreamWriter(output)) { sw.WriteLine(Resources.Head); foreach(var file in files) { var relpath = file.Substring(rootDir.Length + 1); var split= relpath.Split('\\'); var name = split[0]; var path = relpath; sw.WriteLine("Project(\"{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}\") = \"{0}\", \"{1}\", \"{0}\"", name, path); sw.WriteLine("EndProject"); foreach(var configDef in configDefs) { configs.AppendLine(string.Format("{0}{1}", file, configDef)); } } sw.WriteLine(@"Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU ...Other_configurations_see_solution_for_how... EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution"); sw.WriteLine(configs.ToString()); sw.WriteLine(Resources.Tail); } } 

头看起来有点像:

 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 

但我觉得第一行有控制字符 – 小心!

尾巴看起来像

  GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal 

我们构建了一个名为Tree Surgeon的工具,它正是这样做的。 事情正在审查和讨论中,以便随着时间的推移而改变(或放弃它),因为它最初创建时已经发生了变化,但它会在这里做出你所要求的(并且是开源的)。