Сериализация и десериализация файлов Visual Studio Solution - или программное редактирование? - PullRequest
3 голосов
/ 09 ноября 2011

Я хотел программно добавлять и удалять проекты, папки решений и другие элементы, такие как файлы ресурсов, в решение, но я не совсем уверен, что будет лучшим способом для этого.

Для тех, кто не знает, очень упрощенный; Вот как обычно выглядит файл подмены (.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, но это кажется довольно сложным.

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

Использование библиотеки EnvDTE:

Согласно MSDN EnvDTE is an assembly-wrapped COM library containing the objects and members for Visual Studio core automation. Вы также можете найти там документацию Solution и Project с использованием примеров, которые должны быть очень полезны .

Без библиотеки EnvDTE:

Файл решения:

Похоже, здесь мало что можно сделать - добавить проект и настроить конфигурацию сборки. На мой взгляд, лучшим подходом было бы проанализировать его с помощью простого TextReader и переписать его после добавления некоторых данных. Это шаблон.

Project("{solution guid}") = "project name", "projectpath\name.csproj", "{project guid}"

Не забудьте использовать одну и ту же направляющую решения в каждом проекте.

Файлы проекта:

Здесь нет ничего удивительного, это стандартный файл XML, который вы можете создавать / изменять с помощью LINQ to XML. Вся спецификация с примерами доступна здесь: http://msdn.microsoft.com/en-us/library/dd393574.aspx. Конечно Не забудьте использовать тот же гид проекта, что и в файле решения.

Надеюсь, это поможет.

3 голосов
/ 09 ноября 2011

Вот код:

        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 (AddReference-> вкладка Обзор):

C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ PublicAssemblies \ EnvDTE.dll.

Все классы довольно хорошизадокументировано в MSDN.EnvDTE - очень мощная библиотека для автоматического распознавания VS. Вы можете сделать гораздо больше, чем добавлять / удалять.Я бы не стал сериализовывать файл sln сам, я согласен, что было плохо изобретать собственное форматирование.

...