Como manipular projetos do Visual Basic e do C# usando o objeto VSProject2
A interface VSProject2 fornece acesso a métodos e propriedades que são específicas para Visual C# e projetos deVisual Basic. VSProject2 também fornece acesso aos objetos DTE e Project do modelo de ambiente geral por meio das propriedades DTE e Project.
A maioria de métodos e propriedades de VSProject2 se aplicam igualmente a projetos do Visual C# e do Visual Basic. A única exceção é a propriedade Imports, que se aplica ao Visual Basic e se fornece acesso ao objeto Imports. Para obter mais informações, consulte Como manipular a propriedade Imports de projetos do Visual Basic. A propriedade Events fornece acesso a eventos específicos do projeto, como VSLangProjWebReferencesEvents e ReferencesEvents. As tarefas de manipulação de eventos são abordadas em outros tópicos. Para obter mais informações, consulte Respondendo a eventos (projetos do Visual Basic e do Visual C#).
As etapas a seguir ilustram como criar programaticamente um aplicativo as janelas Visual C# usando o modelo de automação geral. Os métodos e as propriedades de VSProject2 são usados para controlar o projeto criado por meio de programação.
Dica
Seu computador pode mostrar diferentes nomes ou localizações para alguns dos elementos de interface do usuário Visual Studio nas instruções a seguir.A edição do Visual Studio que você possui e as configurações que você usa determinam esses elementos.Para obter mais informações, consulte Personalizando configurações de desenvolvimento no Visual Studio.
Para usar o objeto VSProject2 para controlar projetos C #
Crie um projeto de suplemento do Visual Studio usando o Visual C#.
No menu Projeto, clique em Adicionar Referência, clique na guia .NET, selecione VSLangProj, VSLangProj2, VSLangProj80, VSLangProj90 e VSLangProj100 e clique em OK.
Crie duas pastas em seu computador:
<Installation Root>\UserFiles\MyProjects\MyTestProject.
<Installation Root>\UserFiles\MyKeyFiles.
Nesse exemplo, o <Installation Root> é "C:".
Adicione as seguintes instruções de uso na parte superior do arquivo Connect.cs.
using VSLangProj; using VSLangProj2; using VSLangProj80; using VSLangProj90;
usando VSLangProj100; Adicione o seguinte método de chamada para o método de OnConnection.
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; CSVSProj2Manip(_applicationObject); }
Adicione a declaração do método CSVSProj2Manip diretamente abaixo do método OnConnection.
public void CSVSProj2Manip(DTE2 dte) { }
Adicione as seguintes declarações na parte superior do método.
Solution2 soln = (Solution2)_applicationObject.Solution; String csTemplatePath; String csPrjPath; Project proj; VSProject2 vsproj; String webServiceRef; BuildManager bldMgr;
Use AddFromTemplate para criar um projeto do Visual C#.
A sintaxe para obter os modelos é EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "CSharp"), onde o nome " WindowsApplication.zip " é obtido do arquivo de WindowsApplication.zip localizado na pasta <Installation Root>\Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033. Para todos os tipos de projeto do Visual Studio, esses arquivos podem ser encontrados na pasta <Installation Root>\Arquivos de Programas\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\Language. "CSharp" especifica que este projeto é um projeto Visual C#.
Para um projeto do Aplicativo do Windows do Visual Basic, a sintaxe é EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "VisualBasic"). Para projetos do Visual Basic, os modelos de arquivo zip de Aplicativo do Windows são encontrados na pasta <Installation Root>\Arquivos de Programas\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\VisualBasic\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);
Adicione o seguinte código para demonstrar o uso dos métodos VSProject2.
Para adicionar um serviço Web ao projeto de forma programática, você deve substituir o texto do espaço reservado, <web service>, no código com a URL de um serviço Web real. Para localizar uma URL do serviço web, abra um projeto no Visual Studio ambiente de desenvolvimento integrado (IDE). No menu Projeto, clique em Adicionar Referência. Na caixa de diálogo Adicionar Referência, clique no link Diretório do UDDI e use o diretório para localizar um serviço Web.
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");
O método de CSVSProj2Manip usa o objeto VSProject2 para:
Adicionar uma referência a System.Security.dll usando References.
Crie uma pasta de referências Web usando CreateWebReferencesFolder.
Adicionar uma referência Web usando AddWebReference.
Exiba os monikers em tempo de design de compilação usando métodos obtidos por meio da entidade BuildManager.
Renomeie um novo item de projeto usando o método GetUniqueFilename . O método de CSVSProj2Manip adiciona o item de projeto usando AddFromTemplate.
Gera um arquivo de par de chaves usando o método GenerateKeyPairFiles.
A seção de exemplo lista o código completo que inclui um bloco try-catch para o método inteiro.
Para compilar o suplemento, clique em Compilar Solução no menu Compilação.
Abra um projeto do Visual C# na IDE do Visual Studio.
No menu de Ferramentas , clique Gerenciador de Suplementos, e selecione o suplemento da caixa de diálogo Gerenciador de Suplementos . Clique OK para executar o suplemento.
Exibir o arquivo do par de chaves gerados na pasta <Installation Root>\UserFiles\MyKeyFiles usando Sn.exe (Ferramenta de Nome Forte).
Exemplo
O exemplo a seguir é um suplemento básico do Visual Studio que cria um projeto do Visual C# e o manipula usando as propriedades e os métodos do objeto VSProject2.
using System;
using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using System.Windows.Forms;
using VSLangProj;
using VSLangProj2;
using VSLangProj80;
using VSLangProj90;
using VSLangProj100;
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
Imports VSLangProj90
Imports VSLangProj100
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
Compilando o código
Para compilar este código, crie um novo projeto do suplemento Visual Studio e substitua o código do método OnConnection com o código no exemplo. Para obter informações sobre como executar um suplemento, consulte Como controlar suplementos usando o Gerenciador de Suplementos.
Consulte também
Conceitos
Introdução ao objeto VSProject2