Procedura: modificare progetti Visual Basic e C# tramite l'oggetto VSProject2
L'interfaccia VSProject2 consente di accedere a metodi e proprietà specifici dei progetti Visual C# e Visual Basic. VSProject2 fornisce inoltre l'accesso agli oggetti DTE e Project del modello di ambiente generale tramite le proprietà DTE e Project.
La maggior parte dei metodi e delle proprietà di VSProject2 sono uniformemente applicabili ai progetti Visual C# e Visual Basic. L'unica eccezione è data dalla proprietà Imports che riguarda Visual Basic e che consente di accedere all'oggetto Imports. Per ulteriori informazioni, vedere Procedura: modificare la proprietà Imports dei progetti Visual Basic. La proprietà Events consente di accedere a eventi specifici del progetto, ad esempio VSLangProjWebReferencesEvents e ReferencesEvents. Le attività di gestione degli eventi sono trattate in altri argomenti. Per ulteriori informazioni, vedere Risposta agli eventi (progetti Visual Basic e Visual C#).
Di seguito viene illustrato come creare a livello di codice un'applicazione Windows di Visual C# utilizzando il modello di automazione generale. I metodi e le proprietà di VSProject2 consentono di controllare a livello di codice il progetto creato.
Nota
È possibile che le finestre di dialogo e i comandi di menu visualizzati siano diversi da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione del programma. Queste procedure sono state sviluppate con le Impostazioni generali per lo sviluppo attive. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Gestione delle impostazioni.
Per utilizzare l'oggetto VSProject2 al fine di controllare progetti C#
Creare un progetto di componente aggiuntivo Visual Studio utilizzando Visual C#.
Scegliere Aggiungi riferimento dal menu Progetto, selezionare la scheda .NET, selezionare VSLangProj, VSLangProj2, VSLangProj80, VSLangProj90 e VSLangProj100 e quindi fare clic su OK.
Creare due cartelle nel computer:
<Directory radice di installazione>\UserFiles\MyProjects\MyTestProject.
<Directory radice di installazione>\UserFiles\MyKeyFiles.
In questo esempio, la <Directory radice di installazione> è "C:".
Aggiungere le istruzioni using riportate di seguito all'inizio del file Connect.cs.
using VSLangProj; using VSLangProj2; using VSLangProj80; using VSLangProj90;
using VSLangProj100;Aggiungere la chiamata seguente al metodo OnConnection:
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; CSVSProj2Manip(_applicationObject); }
Aggiungere la dichiarazione del metodo CSVSProj2Manip direttamente sotto il metodo OnConnection.
public void CSVSProj2Manip(DTE2 dte) { }
Aggiungere le seguenti dichiarazioni all'inizio del metodo.
Solution2 soln = (Solution2)_applicationObject.Solution; String csTemplatePath; String csPrjPath; Project proj; VSProject2 vsproj; String webServiceRef; BuildManager bldMgr;
Utilizzare il metodo AddFromTemplate per creare un progetto Visual C#.
La sintassi per ottenere i modelli è EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "CSharp"), dove il nome " WindowsApplication.zip " si ottiene dal file WindowsApplication.zip contenuto nella cartella <Directory radice di installazione>\Program Files\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\CSharp\Windows\1033. Per tutti i tipi di progetti di Visual Studio è possibile trovare questi file nella cartella <Radice di installazione>\Programmi\Microsoft Visual Studio 8\Common7\IDE\ProjectTemplates\Linguaggio. "CSharp" specifica che il progetto in questione è un progetto Visual C#.
Per il progetto di un'applicazione Windows di Visual Basic, la sintassi è EnvDTE80.Solution2.GetProjectTemplate("WindowsApplication.zip", "VisualBasic"). Per i progetti Visual Basic i modelli del file zip dell’applicazione Windows sono contenuti nella cartella <Directory radice di installazione>\Program Files\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);
Aggiungere il codice riportato di seguito per illustrare l'utilizzo dei metodi VSProject2.
Per aggiungere a livello di codice un servizio Web al progetto, è necessario sostituire il testo del segnaposto, <web service>, con l'URL di un servizio Web effettivo. Per individuare l'URL di un servizio Web, aprire un progetto nell'ambiente di sviluppo integrato (IDE, Integrated Development Environment) di Visual Studio. Scegliere Aggiungi riferimento Web dal menu Progetto. Nella finestra di dialogo Aggiungi riferimento fare clic sul collegamento Directory UDDI e utilizzare la directory per trovare un servizio 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");
Il metodo VBVSProj2Manip utilizza l'oggetto VSProject2 per:
Aggiungere un riferimento a System.Security.dll mediante la proprietà References.
Creare una cartella di riferimenti Web mediante CreateWebReferencesFolder.
Aggiungere un riferimento Web mediante AddWebReference.
Visualizzare i moniker Design-Time della compilazione utilizzando i metodi ottenuti attraverso la proprietà BuildManager.
Rinominare un nuovo elemento di progetto utilizzando il metodo GetUniqueFilename. Il metodo CSVSProj2Manip aggiunge l'elemento di progetto utilizzando AddFromTemplate.
Generare un file di una coppia di chiavi utilizzando il metodo GenerateKeyPairFiles.
Nella sezione relativa agli esempi è elencato il codice completo, incluso un blocco try-catch per l'intero metodo.
Scegliere Compila soluzione dal menu Compila per compilare il componente aggiuntivo.
Aprire un progetto Visual C# nell'IDE di Visual Studio.
Scegliere Gestione componenti aggiuntivi dal menu Strumenti e quindi selezionare il componente aggiuntivo nella finestra di dialogo Gestione componenti aggiuntivi. Scegliere OK per eseguire il componente aggiuntivo.
Visualizzare il file di una coppia di chiavi generato nella cartella <Directory radice di installazione>\UserFiles\MyKeyFiles utilizzando Sn.exe (strumento Nome sicuro).
Esempio
Nell'esempio riportato di seguito viene illustrato un componente aggiuntivo di Visual Studio di base che crea un progetto Visual C# e lo modifica utilizzando le proprietà e i metodi dell'oggetto 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
Compilazione del codice
Per compilare il codice, creare un nuovo progetto di componente aggiuntivo Visual Studio e sostituire il codice del metodo OnConnection con il codice dell'esempio. Per informazioni su come eseguire un componente aggiuntivo, vedere Procedura: controllare i componenti aggiuntivi tramite Gestione componenti aggiuntivi.
Vedere anche
Concetti
Introduzione all'oggetto VSProject2