Практическое руководство. Операции с проектами Visual Basic и C# с помощью объекта VSProject2
Обновлен: Ноябрь 2007
Интерфейс VSProject2 предоставляет доступ к методам и свойствам, относящимся к проектам Visual C#, Visual Basic и Visual J#. VSProject2 также предоставляет доступ к объектам DTE и Project общей модели среды через свойства DTE и Project.
Большинство методов и свойств VSProject2 применяются к проектам Visual C#, Visual Basic и Visual J# одинаково. Единственное исключение составляет свойство Imports, которое применяется к Visual Basic и предоставляет доступ к объекту Imports. Дополнительные сведения см. в разделе Практическое руководство. Использование свойства Imports проектов Visual Basic. Свойство Events предоставляет доступ к событиям, специфическим для проектов, таким как VSLangProjWebReferencesEvents и ReferencesEvents. Задачи обработки событий описаны в других разделах. Дополнительные сведения см. в разделе Отклик на события (проекты Visual Basic и Visual C#).
Описанные действия показывают, как создать приложение Windows Visual C# программным образом при помощи общей модели автоматизации. Методы и свойства VSProject2 используются для программного управления созданным проектом.
Примечание. |
---|
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска среды. Эти процедуры были разработаны с обычными параметрами разработки. Чтобы изменить параметры, выберите пункт Импорт и экспорт параметров в меню Сервис. Дополнительные сведения см. в разделе Параметры Visual Studio. |
Использование объекта VSProject2 для управления проектами C# и J#
Создайте проект надстройки Visual Studio, используя Visual C#.
В меню Проект щелкните Добавить ссылку, перейдите на вкладку .NET выберите VSLangProj, VSLangProj2 и VSLangProj80, и нажмите кнопку ОК.
Создайте две папки на локальном компьютере.
<корневая папка установки>\UserFiles\MyProjects\MyTestProject.
<корневая папка установки>\UserFiles\MyKeyFiles.
В этом примере в качестве <корневой папки установки> используется "C:".
Добавьте в начало файла Connect.cs следующие операторы using.
using VSLangProj; using VSLangProj2; using VSLangProj80;
Добавьте в метод OnConnection следующий вызов метода.
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; CSVSProj2Manip(_applicationObject); }
Добавьте объявление метода CSVSProj2Manip сразу после метода OnConnection.
public void CSVSProj2Manip(DTE2 dte) { }
Добавьте следующие объявления в начало метода:
Solution2 soln = (Solution2)_applicationObject.Solution; String csTemplatePath; String csPrjPath; Project proj; VSProject2 vsproj; String webServiceRef; BuildManager bldMgr;
Чтобы создать проектVisual C#, используйте AddFromTemplate.
Синтаксис для получения шаблонов будет следующим: EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "CSharp"), где имя " WindowsApplication.zip " берется из файла WindowsApplication.zip, расположенного в папке <корневая папка установки>\Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033. Для всех типов проектов Visual Studio эти файлы можно найти в папке <корневой каталог установки>\Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\язык. "CSharp" определяет, что этот проект является проектом Visual C#.
Для проекта приложения Windows Visual Basic синтаксис будет следующим: EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "VisualBasic"). Для проектов Visual Basic, шаблоны ZIP-файла приложения Windows расположены в папке <корневая папка установки>\ Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\VisualBasic\Windows\1033.
Для проекта приложения Windows Visual J# синтаксис будет следующим: EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "JSharp"). Для проектов Visual J#, шаблоны ZIP-файла приложения Windows расположены в папке <корневая папка установки>\ Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\JSharp\Windows\1033.
// Make sure you create the folders that // make up the file path // on your computer. You can replace // this with your own file path. csPrjPath = "C:\\UserFiles\\MyProjects\\MyTestProject"; // Get the project template path for a C# windows // application. csTemplatePath = soln.GetProjectTemplate("WindowsApplication.zip", "CSharp"); // Create a new windows application by using the // template obtained above. soln.AddFromTemplate(csTemplatePath, csPrjPath, "Test2CSProj", false);
Добавьте следующий код для демонстрации применения методов VSProject2.
Чтобы добавить веб-службу в проект программным образом, текст местозаполнителя <web service> в коде потребуется заменить URL-адресом фактической веб-службы. Чтобы найти URL-адрес веб-службы, откройте проект в интегрированной среде разработки (IDE) Visual Studio. В меню Проект выберите пункт Добавить веб-ссылку. В диалоговом окне Добавление ссылки щелкните ссылку Каталог UDDI и используйте каталог для поиска веб-службы.
proj = soln.Projects.Item(1); // Cast the project as a VSProject2 object. vsproj = (VSProject2)proj.Object; // Add a reference to System.Security.dll. MessageBox.Show("Adding a reference to System.Security.dll"); // Remove the <version number> in the following path // and replace it with one of the version // number folders that appear // in <installation root>\WINDOWS\Microsoft.NET\Framework // folder vsproj.References.Add ("C:\\WINDOWS\\Microsoft.NET\\Framework\\<version number>\\System.Security.dll"); // Create a Web references folder. MessageBox.Show("Creating a Web references folder."); vsproj.CreateWebReferencesFolder(); // Add a Web reference to the folder. MessageBox.Show("Adding a Web reference."); // Replace the placeholder, <web service>, with a // Web service URL. webServiceRef = "<web service>"; vsproj.AddWebReference(webServiceRef); bldMgr = vsproj.BuildManager; Array monikers = null; // String moniker = null; String msg = null; Object obj = bldMgr.DesignTimeOutputMonikers; if (obj != null) { try { monikers = (System.Array)obj; foreach(String tempmoniker in monikers) { msg += bldMgr.BuildDesignTimeOutput (tempmoniker) + "\n"; } } catch(Exception ex) { MessageBox.Show(ex.Message); } MessageBox.Show("The build design-time output is:" + "\n" + msg); } // Change the MyHTML file name by using GetUniqueFilename. MessageBox.Show("Adding an HTML page named 'MyHTML'..."); String itemTemplatePath = soln.GetProjectItemTemplate("HTMLPage", "CSharp"); proj.ProjectItems.AddFromTemplate (itemTemplatePath, "MyHtml"); MessageBox.Show("Renaming MyHtml' to 'MyTesthtml.htm'..."); vsproj.Project.ProjectItems.Item("MyHtml").Name = vsproj.GetUniqueFilename(proj, "MyTesthtml", "htm"); // Generate a key-pair file. MessageBox.Show("Generating a key-file..."); vsproj.GenerateKeyPairFiles("C:\\UserFiles\\MyKeyFiles \\MyKeyText2.bin", "0");
Метод CSVSProj2Manip использует объект VSProject2 для:
Добавления ссылки на System.Security.dll посредством References.
Создания папки веб-ссылок при помощи CreateWebReferencesFolder.
Добавления веб-ссылки при помощи AddWebReference.
Отображения специальных имен времени построения при помощи методов, полученных через свойство BuildManager.
Переименования нового элемента проекта с помощью метода GetUniqueFilename. Метод CSVSProj2Manip добавляет элемент проекта при помощи AddFromTemplate.
Создания файла пары ключей при помощи метода GenerateKeyPairFiles.
В разделе примера приведен полный код с блоком try-catch для всего метода.
Чтобы построить надстройку, в меню Построение щелкните Построить решение.
Откройте проект Visual C#, Visual J# или Visual Basic в интерфейсе IDE Visual Studio.
В меню Свойства щелкните Диспетчер надстроек и в диалоговом окне Диспетчер надстроек выберите надстройку. Нажмите ОК для выполнения надстройки.
Просмотрите созданный файл пары ключей по пути <корневая папка установки>\UserFiles\MyKeyFiles при помощи Средство строгих имен (Sn.exe).
Пример
Следующий пример кода представляет собой простую надстройку Visual Studio, которая создает проект Visual C# и выполняет операции с ним при помощи свойств и методов объекта VSProject2.
using System;
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using System.Windows.Forms;
using VSLangProj;
using VSLangProj2;
using VSLangProj80;
public void OnConnection(object application,
ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
CSVSProj2Manip(_applicationObject);
}
public void CSVSProj2Manip(DTE2 dte)
{
try
{
Solution2 soln = (Solution2)_applicationObject.Solution;
String csTemplatePath;
String csPrjPath;
Project proj;
VSProject2 vsproj;
String webServiceRef;
BuildManager bldMgr;
// Make sure you create the folders that make up the file path
// on your computer.
// You can replace this with your own file path.
csPrjPath = "C:\\UserFiles\\MyProjects\\MyTestProject";
// Get the project template path for a C# windows application.
csTemplatePath = soln.GetProjectTemplate
("WindowsApplication.zip", "CSharp");
// Create a new Windows application by using the template
// obtained above.
soln.AddFromTemplate(csTemplatePath, csPrjPath,
"Test2CSProj", false);
proj = soln.Projects.Item(1);
// Get a reference to the VSProject2 object.
vsproj = (VSProject2)proj.Object;
// Add a reference to System.Security.dll.
MessageBox.Show("Adding a reference to System.Security.dll");
// Remove the <version number> in the following path
// and replace it with one of the version
// number folders that appear
// in <installation root>\WINDOWS\Microsoft.NET\Framework
// folder
vsproj.References.Add
("C:\\WINDOWS\\Microsoft.NET\\Framework\\<version number>\\System.Security.dll");
// Create a Web references folder.
MessageBox.Show("Creating a Web references folder.");
vsproj.CreateWebReferencesFolder();
// Replace the placeholder, <web service>, with a
// Web service URL.
MessageBox.Show("Adding a Web reference.");
// Replace the placeholder, <web service>, with a
// Web service URL.
webServiceRef = "<web service>";
vsproj.AddWebReference(webServiceRef);
bldMgr = vsproj.BuildManager;
Array monikers = null;
// String moniker = null;
String msg = null;
Object obj = bldMgr.DesignTimeOutputMonikers;
if (obj != null)
{
try
{
monikers = (System.Array)obj;
foreach(String tempmoniker in monikers)
{
msg += bldMgr.BuildDesignTimeOutput(tempmoniker)
+ "\n";
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
MessageBox.Show("The build design-time output is:" + "\n"
+ msg);
}
// Change the MyHTML file name by using GetUniqueFilename.
MessageBox.Show("Adding an HTML page named 'MyHTML'...");
String itemTemplatePath =
soln.GetProjectItemTemplate("HTMLPage", "CSharp");
proj.ProjectItems.AddFromTemplate(itemTemplatePath, "MyHtml");
MessageBox.Show("Renaming MyHtml' to 'MyTesthtml.htm'...");
vsproj.Project.ProjectItems.Item("MyHtml").Name =
vsproj.GetUniqueFilename(proj, "MyTesthtml", "htm");
// Generate a key-pair file.
MessageBox.Show("Generating a key-file...");
vsproj.GenerateKeyPairFiles
("C:\\UserFiles\\MyKeyFiles\\MyKeyText2.bin", "0");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80
Imports VSLangProj
Imports VSLangProj2
Imports VSLangProj80
Public Sub OnConnection(ByVal application As Object, _
ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, _
ByRef custom As Array) Implements IDTExtensibility2.OnConnection
_applicationObject = CType(application, DTE2)
_addInInstance = CType(addInInst, AddIn)
CSVSProj2Manip(_applicationObject)
End Sub
Sub CSVSProj2Manip(ByVal dte As DTE2)
Try
Dim soln As Solution2 = CType(_applicationObject.Solution, _
Solution2)
Dim csTemplatePath As String
Dim csPrjPath As String
Dim proj As Project
Dim vsproj As VSProject2
Dim webServiceRef As String
Dim bldMgr As BuildManager
' Create this or your own file path on your computer.
' The file path must exist before you run this add-in.
csPrjPath = "C:\UserFiles\MyProjects\MyTestProject"
' Get the project template path for a C# windows application.
csTemplatePath = soln.GetProjectTemplate _
("WindowsApplication.zip","CSharp")
' Create a new Windows Application
' using the template obtained above.
soln.AddFromTemplate(csTemplatePath, csPrjPath _
, "Test2CSProj", False)
proj = soln.Projects.Item(1)
' Cast the project to a VSProject2.
vsproj = CType(proj.Object, VSProject2)
' Add a reference to System.Security.dll.
MsgBox("Adding a reference to System.Security.dll")
' Remove the <version number> in the following path
' and replace it with one of the version
' number folders that appear
' in <installation root>\WINDOWS\Microsoft.NET\Framework
' folder
vsproj.References.Add _
("C:\WINDOWS\Microsoft.NET\Framework\<version number>\System.Security.dll")
' Create a Web references folder.
MsgBox("Creating a Web references folder.")
vsproj.CreateWebReferencesFolder()
' Replace the placeholder, <web service>, with a
' web service URL.
webServiceRef = "<web service>"
MsgBox("Adding a Web reference.")
vsproj.AddWebReference(webServiceRef)
bldMgr = vsproj.BuildManager
Dim monikers As String() = Nothing
Dim moniker As String = Nothing
Dim msg As String = ""
Dim obj As Object = bldMgr.DesignTimeOutputMonikers
If Not obj Is Nothing Then
Try
monikers = CType(obj, String())
For Each moniker In monikers
msg &= bldMgr.BuildDesignTimeOutput(moniker) + vbCr
Next
Catch ex As System.Exception
MsgBox(ex.ToString)
End Try
MsgBox("The build design-time output is:" + vbCr + msg)
End If
' Use the UniqueFilename to rename a new project item.
MsgBox("Adding an HTML page called 'MyHTML'...")
Dim itemTemplatePath As String = _
soln.GetProjectItemTemplate("HTMLPage", "CSharp")
proj.ProjectItems.AddFromTemplate(itemTemplatePath, "MyHtml")
MsgBox("Renaming MyHtml' to 'MyTesthtml.htm'...")
vsproj.Project.ProjectItems.Item("MyHtml").Name = _
vsproj.GetUniqueFilename(proj, "MyTesthtml", "htm")
' Generate a key-pair file.
vsproj.GenerateKeyPairFiles _
("C:\UserFiles\MyKeyFiles\MyKeyText2.bin", "0")
Catch ex As System.Exception
MsgBox(ex.ToString)
End Try
End Sub
Компиляция кода
Для компиляции кода создайте новый проект надстройки Visual Studio и замените код метода OnConnection кодом из данного примера. Сведения о запуске надстройки см. в разделе Практическое руководство. Управление надстройками с помощью диспетчера надстроек.
См. также
Основные понятия
Знакомство с объектом VSProject2