Практическое руководство. Управление проектами при помощи модели проекта Visual C++
В следующей процедуре показано, как искать информацию о проектах Visual C++ в некоторых объектах модели проекта, доступных в библиотеке Microsoft.VisualStudio.ProjectEngine.dll. Данная сборка использует функциональные возможности компилятора, компоновщика и других встроенных средств, а также функциональные возможности диалогового окна "Страницы свойств" для проекта Visual C++.
Вы можете интегрировать код в указанные ниже процедуры, используя VSPackage с именем TestVCProjectPackage, в котором есть команда меню "Мое имя команды". Дополнительные сведения об этой операции см. в разделе Пошаговое руководство: Создание команды меню ресурсов с помощью шаблона пакета Visual Studio.
Использование VCProjectEngine для управления проектами Visual C++
Добавьте ссылку на Microsoft.VisualStudio.VCCodeModel (на вкладке Расширения) и System.Windows.Forms (на вкладке Framework).
Добавьте следующие операторы using в файл TestVCProjectPackagePackage.cs:
using EnvDTE; using EnvDTE80; using EnvDTE90; using EnvDTE100; using Microsoft.VisualStudio.VCCodeModel; using System.Windows.Forms;
Удалите существующий код из метода MenuItemCallback. Добавьте в данный метод код, позволяющий получить объект приложения (в данном случае DTE2:
private void MenuItemCallback(object sender, EventArgs e) { DTE2 dte2 = (DTE2)GetService(typeof(DTE)); }
В том же методе получите открытые проекты. Убедитесь, что проект действительно открыт.
private void MenuItemCallback(object sender, EventArgs e) { DTE2 dte2 = (DTE2)GetService(typeof(DTE)); VCProject prj; Projects projColl = dte2.Solution.Projects; if (projColl.Count == 0) { MessageBox.Show("You must have a project open in the experimental instance."); return; } if (projColl.Count > 0) { // to be filled in later } }
Получите открытый проект и проверьте настройки проекта.
private void MenuItemCallback(object sender, EventArgs e) { DTE2 dte2 = (DTE2)GetService(typeof(DTE)); VCProject prj; VCAssemblyReference vcar; int idx; IVCCollection mycollection, mycollection2; VCConfiguration cfg; String sTest = "Configuration Information:" + "\n"; VCFile file; try { Projects projColl = dte2.Solution.Projects; if (projColl.Count == 0) { MessageBox.Show("You must have a project open in the experimental instance."); return; } if (projColl.Count > 0) { prj = (VCProject)dte2.Solution.Projects.Item(1).Object; if (prj.CanAddAssemblyReference(@"%VSINSTALLDIR%\Common7\IDE\PublicAssemblies\VSLangProj.dll")) { vcar = (VCAssemblyReference)prj.AddAssemblyReference(@"%VSINSTALLDIR%\Common7\IDE\PublicAssemblies\VSLangProj.dll"); MessageBox.Show("The assembly named" + vcar.AssemblyName + " was added."); } mycollection = (IVCCollection)prj.Configurations; MessageBox.Show("Number of configurations in the project : " + mycollection.Count); for (idx = 1; idx <= mycollection.Count; idx++) { cfg = (VCConfiguration)mycollection.Item(idx); sTest = sTest + "Configuration name: " + cfg.Name + "\n" + "Platform: " + "\n" + cfg.Platform.ToString() + "\n" + "Program database: \n" + cfg.ProgramDatabase + "\n"; } MessageBox.Show(sTest); mycollection2 = (IVCCollection)prj.Files; MessageBox.Show("Number of files in the project: " + mycollection2.Count); } } catch (SystemException ex) { MessageBox.Show("ERROR: " + ex.ToString()); } }
Постройте решение и запустите отладку. Откроется второй экземпляр Visual Studio. Он называется экспериментальным.
Откройте проект Visual C++ в экспериментальном экземпляре.
В меню Сервис выберите пункт Мое имя команды.
Код команды добавляет ссылку на VSLangProj.dll и отображает информацию об этой библиотеке с помощью объекта VCAssemblyReference. Он также перечисляет и отображает все имена конфигурации с помощью объекта VCConfiguration. VCFile используется для отображения расширений файлов, присутствующих в проекте Visual C++. Объекты VCProject и IVCCollection используются для объявления проекта как проекта Visual C++ и для перечисления файлов коллекций и конфигурации.