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

时间:2010-04-29 09:49:13

标签: c# .net visual-studio

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

4 个答案:

答案 0 :(得分:3)

查看Text Template Transformation Toolkit (T4)。它非常可爱,并且支持ASP.NET MVC中的一些文件生成。 Scott Hanselman在这个主题上有一个很棒的introductory article

答案 1 :(得分:2)

Visual Studio SDK将成为你的目标。有一些方法可以创建文件,我想也可以根据项目模板进行项目。例如,您可以创建一个新的“asp.net mvc”项目或类库。你甚至可以创建自己的模板。

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

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

进展良好!

答案 2 :(得分:1)

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

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

我们在这里做的是设置解决方案文件的序言,然后插入每个解决方案(你需要项目类型guid,在这里看到开始FAE,但不是项目自己的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

答案 3 :(得分:0)

我们构建了一个名为Tree Surgeon的工具。随着时间的推移,自最初创建以来,事情正在进行审查和讨论以解除(或抛弃它),但它会在这里做出你所要求的(并且是开源的)。