我想在.NET中编写一个向导,可以通过编程方式生成带有一些项目的Visual Studio解决方案。我将拥有一个XML文件,其中包含需要包含在项目中的文件的详细信息以及获取它们的各自路径和项目名称列表。是否有办法实现这一点?
我想在.NET中编写一个向导,可以通过编程方式生成带有一些项目的Visual Studio解决方案。我将拥有一个XML文件,其中包含需要包含在项目中的文件的详细信息以及获取它们的各自路径和项目名称列表。是否有办法实现这一点?
看看文本模板转换工具(T4)。它相当不错,可以用于ASP.NET MVC中的一些文件生成。Scott Hanselman在这个主题上有一篇很好的介绍性文章。
我相当确定,这只能在VS内完成。
否则,生成项目和sln文件并通过生成XML文件是没有问题的,这是其中一个好处,最终它们是纯粹的XML文件。您只需要生成一些Projectd Guids,但我认为这应该非常简单且完全“合法”。
进展顺利!
您可以使用简短的代码或脚本来完成此操作。 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