我想在.net中编写一个向导,它以编程方式生成带有一些项目的Visual Studio解决方案。我将有一个XML文件,其中包含需要包含在项目中的文件的详细信息,以及它们各自的获取路径和项目名称列表。有什么方法可以实现这个
答案 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的工具。随着时间的推移,自最初创建以来,事情正在进行审查和讨论以解除(或抛弃它),但它会在这里做出你所要求的(并且是开源的)。