VS2005 Automation

Я пишу Add-in для студии, который бы позволил более эффективно компилировать проекты gcc компилятором, которым мы пользуемся.
На данный момент самой важной и насущной проблемой является управление компилятором, получение текущих настроек и установка своих, и вот тут начинаются проблемы 🙁

Для любого Add-in доступен объект типа EnvDTE2, который предоставляет доступ ко всему, что есть в студии, т.е. например EnvDTE.Solution.Projects возвращает набор проектов, без всякой привязки к конкретному языку, этого достаточно для создания всяких формочек и настроек, но не достаточно для того, чтобы можно было управлять компилятором. Поиски в документации MSDN выявили пространство имен Microsoft.VisualStudio в котором есть интересные классы – такие как VCProject, VCProjectEngine, которые предоставляют все необходимые средства для управления C++ проектом и всеми его тонкими настройками.
Существует лишь одна проблема – как получить объект VCProjectEngine?
Майкрософт пишет, что это можно сделать к примеру при помощи CoCreateInstance – но в реальности этот метод вызывает проблемы, которые выражаются в странном поведении VS2005.

Существует еще один способ, недокументированный.

Мы можем получить список C++ проектов таким образом:
Projects projects = (Projects)dte.GetObject(“VCProjects”);
После этого мы делаем следующее:
VCProjectEngine engine = (VCProjectEngine)projects.Properties.Item(“VCProjectEngine”);

К сожалению этот метод не работает 🙂 Хотя тот источник, из которого я его почерпнул пишет, что именно при помощи него они все сделали.

Последняя строчка вызывает InvalidCastException, т.е. объект возвращается, но он не является тем, что нам нужно.

Update
Получить объект VCProject и VCProjectEngine удалось.
Поиски по форумам увенчались успехом и в одном из постов какого-то чина из майкрософт я нашел подходящий код, который без всякого хакерства работает как положено 🙂


Projects projects = (Projects)_applicationObject.Solution.Projects;

VCProject vcproj = null;
foreach (Project p in projects)
{
vcproj = p.Object as VCProject;
}

Debug.Assert(vcproj != null);

Суть заключается в том, что проект из объектной модели automation хранит ссылку на объект VCProject – ну а дальше мы просто этот объект извлекаем.

Теперь для того, чтобы получить настройки компилятора нам надо получить ссылку на текущую конфигурацию. Для этого мы воспользуемся свойством Configurations.
И хотя это не текущая конфигурация, но все же то, что надо 🙂


Debug.Assert((vcproj.Configurations as IVCCollection).Count != 0);
VCConfiguration conf = (vcproj.Configurations as IVCCollection).Item(1) as VCConfiguration;

Самый главный момент, понятый мной – это то, что в пространстве Microsoft.VisualStudio в качестве контейнера используется не System.Array, а IVCCollection – эта неочевидность вынудила меня потратить лишний час на понимание сути проблемы – почему нельзя было извлечь объект из контейнера.

Теперь мы получаем ссылку на элемент Tool – это непосредственно та вещь, которая позволяет управлять всеми настройками компилятора.


Debug.Assert((conf.Tools as IVCCollection).Count != 0);
VCNMakeTool tool = (conf.Tools as IVCCollection).Item(1) as VCNMakeTool;

Так как в нашем случае используется Makefile project – то мы приводим к типу VCNMakeTool

Собсно все – теперь мы получили полный контроль над процессом компиляции.
В принципе – это лишь первый шаг – поскольку нужно отказываться от промежуточной стадии в виде makefile и создавать свой тип проекта со своими настройками сборки программы, а соответственно и совершенствовать Add-in дальше.

Similar Posts

  • Отчёт: Румыния 26.04.2008 – 1.05.2008 (день первый)

    Пролог На майские праздники составом из трёх человек (среди которых две дамы), мицу-клубников мы совершили тур на машине (mitsubishi lancer 9) по Румынии и Украине, 5 дней там и 4 здесь. Суммарно накатали 4300 километров, из которых 2500 пришлись на Румынию, средний расход бензина составил 6.2/100 по загранице и 7.3/100 по родине. Ночевали в гостинницах,…

  • Крым

    Крым весной – это здорово 🙂 И пусть эта весна не очень теплая, там все-равно теплее и приятнее 🙂 Особенно в Ялте, все-таки это уже субтропики. Не очень приятно, правда, приезжать в 4 утра в Симферополь, но зато оттуда в такую рань очень легко выбраться. Приятно ходить по Ялте в 6 утра, когда ты еще…

  • Сумбур

    Что-то давно не писал я, мысли вроде бы появляются, но потом хлоп – и нету 🙂 Съездил на праздники к бабушке в Ульяновку, что в 250 км от Киева. Прикольно там, спокойно, компов практически нету. С другой стороны, делать там, по большому счету, нечего. Вот народ и спивается потихоньку, или женится. Для меня было несколько…

  • Скоро зима

    Утро сегодняшнего вторника порадовало – пришёл на работу, а мне сообщают, что у нас в Киеве открылась ещё одна горнолыжная трасса, не совсем в городе правда – в Вышгороде, но с моей точки зрения – что ехать на Протасов Яр, что в Вышгород – монопенисуально 🙂 Там тоже будут снегопушки, но уклон получше. Так что…

  • PS3 Mediaserver

    Давно я не постил ничего 🙂 Расскажу я про одну полезную программку, благодаря которой моя “чёрная прелесть” (PS3) стала ещё более прелестной. PS3 Mediaserver (http://ps3mediaserver.blogspot.com/). Хороша тем, что умеет стримить *.mkv файлы на приставку без всяких действий с шаманским бубном и/или установкой тыщ миллионов кодеков. Написана на джаве, поэтому просит поставить JVM, но, скажу я…