繁体   English   中英

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

[英]Programmatically generate Visual Studio Solution

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

查看文本模板转换工具包(T4) 它非常好用,并为ASP.NET MVC中的某些文件生成提供了支持。 斯科特·汉瑟曼(Scott Hanselman) 撰写了一篇有关该主题的精彩介绍文章

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

我很确定您只能在VS内执行此操作。

否则,生成项目并没有问题,并且sln文件将生成xml文件,这就是它们的最终目的是纯xml的一件好事。 您只需要生成一些Projected Guid,但是我认为这将非常简单并且完全“合法”。

进步不错!

您可以使用少量的代码或脚本来完成此操作。 Visual Studio将为您填充大多数GUID。

我一次性完成了这样的事情来整理项目。 它不是100%完美的,您最终可能会从代码处理项目名称的方式中得到重复。 希望它能为您指明道路。

我们在这里要做的是设置解决方案文件的序言,然后插入每个解决方案(您需要Project类型guid(在此处以FAE开头,而不是Project自己的GUID,VS会在保存Solution文件时插入该GUID)。 还有更多样板,然后我们为每个项目插入构建配置。 对于每个项目,我大约有12种配置(不同的Release和Debug设置),但在这里将其简化为两个。

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的工具来完成此任务。 自从它最初创建以来,随着时间的推移,事情正在审查和讨论,以审查(或放弃它),但是它可以满足您在这里的要求(并且是开源的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM