我想以编程方式添加和删除项目、解决方案文件夹和其他项目(例如解决方案的资源文件),但我不确定最好的方法是什么。
对于那些不知道的人,高度简化;这是 sulution 文件 (.sln) 通常的样子:
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "project name", "projectpath\name.csproj", "{785ECC80-AF1B-4FBC-B97B-2EC43B7E81E8}"
EndProject
Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{785ECC80-AF1B-4FBC-B97B-2EC43B7E81E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
EndGlobalSection
EndGlobal
我不确定这是否是一个真正的开放标准,例如 xml(是吗?),但看起来 Visual Basic 团队似乎制作了自己的 xml 版本。 (不是夸奖)
无论如何,将其序列化到对象或从对象反序列化的最佳方法是什么?我正在考虑制作自己的 IFormatter,但这似乎相当复杂。
根据 MSDN
EnvDTE is an assembly-wrapped COM library containing the objects and members for Visual Studio core automation.
您还可以找到 Solution
和 Project
接口的文档以及使用示例,这应该非常有帮助。
解决方案文件:
这里似乎没有太多要做的事情 - 添加项目并设置构建配置。在我看来,最好的方法是使用简单的 TextReader 解析它,并在添加一些数据后重写它。这是模板。
Project("{solution guid}") = "project name", "projectpath\name.csproj", "{project guid}"
记住在每个项目中使用相同的解决方案指南。
项目文件:
这并不奇怪,它是标准 XML 文件,您可以使用 LINQ to XML 创建/修改它。包含示例的完整规范可在此处获取:http://msdn.microsoft.com/en-us/library/dd393574.aspx。当然 不要忘记使用与解决方案文件中相同的项目 guid。
希望对你有帮助。
这是一些代码:
using EnvDTE;
.....
Solution s = new SolutionClass();
s.Open(solutionFilePath);
s.AddFromFile(projectFilePath);
s.Remove(s.Projects[6]);
您可以按照
foreach(var project in s.Projects)
中的方式导航项目,并检查其 project.Name
属性以找到您想要的项目。
添加到 dll 后面的引用(添加引用 -> 浏览选项卡):
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\EnvDTE.dll。
所有类在 MSDN 中都有很好的文档记录。 EnvDTE 是非常强大的 VS 自动操作库,除了添加/删除之外,您还可以做更多的事情。我不会自己序列化 sln 文件,我同意发明自己的格式是不好的。
对于任何遇到此线程的人,解决方案文件序列化器已开源:https://github.com/microsoft/vs-solutionpersistence