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

5

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


作为 Visual Studio 的 AddIn/Makro 还是独立运行? - Bobby
我想把它做成一个独立的应用程序。 - Krishnaraj Barvathaya
4个回答

3

经过长时间的谷歌搜索,我发现了这个链接http://goo.gl/ZQhV。我认为这将有助于我设置自动化Visual Studio解决方案生成。 - Krishnaraj Barvathaya
你的第一个链接是指向Visual Studio扩展和插件的MSDN文档,因此无法帮助你构建独立的解决方案(正如你所需求的)。你可能会在Tree Surgeon项目中有更多的运气,尽管它看起来对放置事物的位置有着固定的规则,因此可能无法满足你的要求。 - alastairs

3
好的,Visual Studio SDK是您需要使用的路径。有一些方法可以创建文件,我想也可以基于项目模板创建项目。因此,例如,您可以创建一个新的“asp.net mvc”项目或类库。甚至可以创建自己的模板。

我相当确定,这只能在VS内完成。

否则,生成项目和sln文件并通过生成XML文件是没有问题的,这是其中一个好处,最终它们是纯粹的XML文件。您只需要生成一些Projectd Guids,但我认为这应该非常简单且完全“合法”。

进展顺利!


2

您可以使用简短的代码或脚本来完成此操作。 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

请注意,我在此处放置的 GUID 是一个 C# 项目类型。因此,这段代码将为您提供一个包含多个 C# 项目的解决方案,无论它们实际上是什么类型。可能需要进行微调,结果因人而异 :) - CJBrew

0
我们开发了一个名为 Tree Surgeon的工具,正是为了解决这个问题。由于时代变化,该工具正在接受审查和讨论,以确定是否要保留它,但它确实可以实现您在此处所要求的功能(并且是开源的)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接