Usare le procedure guidate con i modelli di progetto
In Visual Studio è disponibile l'interfaccia IWizard che, se implementata, consente di eseguire il codice personalizzato quando un utente crea un progetto da un modello.
La personalizzazione del modello di progetto può essere usata per visualizzare l'interfaccia utente personalizzata che raccoglie l'input dell'utente per personalizzare il modello, aggiungere altri file al modello o qualsiasi altra azione consentita in un progetto.
I IWizard metodi di interfaccia vengono chiamati in varie occasioni durante la creazione del progetto, a partire non appena un utente fa clic su OK nella finestra di dialogo Nuovo progetto . Ogni metodo dell'interfaccia viene denominato per descrivere il punto in cui viene chiamato. Ad esempio, Visual Studio chiama RunStarted immediatamente quando inizia a creare il progetto, rendendolo una posizione ottimale per scrivere codice personalizzato per raccogliere l'input dell'utente.
Creare un progetto modello di progetto con un progetto VSIX
Si inizia a creare un modello personalizzato con il progetto modello di progetto, che fa parte di Visual Studio SDK. In questa procedura si userà un progetto modello di progetto C#, ma è disponibile anche un progetto modello di progetto Visual Basic. Aggiungere quindi un progetto VSIX alla soluzione che contiene il progetto modello di progetto.
Creare un progetto modello di progetto C# (in Visual Studio selezionare File>nuovo>progetto e cercare "modello di progetto"). Denominarlo MyProjectTemplate.
Nota
Potrebbe essere richiesto di installare Visual Studio SDK. Per altre informazioni, vedere Installazione di Visual Studio SDK.
Aggiungere un nuovo progetto VSIX nella stessa soluzione del progetto modello di progetto (in Esplora soluzioni selezionare il nodo della soluzione, fare clic con il pulsante destro del mouse e selezionare Aggiungi>nuovo progetto e cercare "vsix"). Denominarlo MyProjectWizard.
Impostare il progetto VSIX come progetto di avvio. In Esplora soluzioni selezionare il nodo del progetto VSIX, fare clic con il pulsante destro del mouse e scegliere Imposta come progetto di avvio.
Aggiungere il progetto modello come asset del progetto VSIX. In Esplora soluzioni, nel nodo del progetto VSIX trovare il file source.extension.vsixmanifest. Fare doppio clic su di esso per aprirlo nell'editor del manifesto.
Nell'editor del manifesto selezionare la scheda Asset sul lato sinistro della finestra.
Nella scheda Asset selezionare Nuovo. Nella finestra Aggiungi nuovo asset selezionare Microsoft.VisualStudio.ProjectTemplate per il campo Tipo. Nel campo Origine selezionare Un progetto nella soluzione corrente. Nel campo Progetto selezionare MyProjectTemplate. Quindi fare clic su OK.
Creare la soluzione e avviare il debug. Verrà visualizzata una seconda istanza di Visual Studio. L'operazione potrebbe richiedere alcuni minuti.
Nella seconda istanza di Visual Studio provare a creare un nuovo progetto con il nuovo modello (File>Nuovo>progetto, cercare "myproject"). Il nuovo progetto dovrebbe essere visualizzato con una classe denominata Class1. È stato creato un modello di progetto personalizzato. Arrestare ora il debug.
Creare una procedura guidata modello personalizzata
Questa procedura illustra come creare una procedura guidata personalizzata che apre un Windows Form prima della creazione del progetto. Il modulo consente agli utenti di aggiungere un valore di parametro personalizzato aggiunto al codice sorgente durante la creazione del progetto.
Configurare il progetto VSIX per consentire la creazione di un assembly.
In Esplora soluzioni selezionare il nodo del progetto VSIX. Sotto Esplora soluzioni verrà visualizzata la finestra Proprietà. In caso contrario, selezionare Visualizza>finestra Proprietà oppure premere F4. Nella finestra Proprietà selezionare i campi seguenti in
true
:Includi assembly nel contenitore VSIX
Includi simboli di debug nella distribuzione VSIX locale
Includere i simboli di debug nel contenitore VSIX
Aggiungere l'assembly come asset al progetto VSIX. Aprire il file source.extension.vsixmanifest e selezionare la scheda Asset . Nella finestra Aggiungi nuovo asset , per Tipo selezionare Microsoft.VisualStudio.Assembly, in Origine selezionare Un progetto nella soluzione corrente e per Progetto selezionare MyProjectWizard.
Aggiungere i riferimenti seguenti al progetto VSIX. (In Esplora soluzioni, nel nodo del progetto VSIX selezionare Riferimenti, fare clic con il pulsante destro del mouse e selezionare Aggiungi riferimento. Nella scheda Framework della finestra di dialogo Aggiungi riferimento individuare l'assembly System.Windows Form e selezionarlo. Trovare e selezionare anche gli assembly System e System.Drawing . Selezionare ora la scheda Estensioni . Trovare l'assembly EnvDTE e selezionarlo. Trovare anche l'assembly Microsoft.VisualStudio.TemplateWizardInterface e selezionarlo. Fare clic su OK.
Aggiungere una classe per l'implementazione della procedura guidata al progetto VSIX. (In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto VSIX e scegliere Aggiungi, quindi Nuovo elemento, quindi Classe. Denominare la classe WizardImplementation.
Sostituire il codice nel file WizardImplementationClass.cs con il codice seguente:
using System; using System.Collections.Generic; using Microsoft.VisualStudio.TemplateWizard; using System.Windows.Forms; using EnvDTE; namespace MyProjectWizard { public class WizardImplementation:IWizard { private UserInputForm inputForm; private string customMessage; // This method is called before opening any item that // has the OpenInEditor attribute. public void BeforeOpeningFile(ProjectItem projectItem) { } public void ProjectFinishedGenerating(Project project) { } // This method is only called for item templates, // not for project templates. public void ProjectItemFinishedGenerating(ProjectItem projectItem) { } // This method is called after the project is created. public void RunFinished() { } public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) { try { // Display a form to the user. The form collects // input for the custom message. inputForm = new UserInputForm(); inputForm.ShowDialog(); customMessage = UserInputForm.CustomMessage; // Add custom parameters. replacementsDictionary.Add("$custommessage$", customMessage); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } // This method is only called for item templates, // not for project templates. public bool ShouldAddProjectItem(string filePath) { return true; } } }
UserInputForm a cui viene fatto riferimento in questo codice verrà implementato in un secondo momento.
La
WizardImplementation
classe contiene implementazioni del metodo per ogni membro di IWizard. In questo esempio solo il metodo esegue un'attività RunStarted . Tutti gli altri metodi non eseguono alcuna operazione o restituisconotrue
.Il RunStarted metodo accetta quattro parametri:
Parametro Object di cui è possibile eseguire il cast all'oggetto radice _DTE per consentire di personalizzare il progetto.
Parametro Dictionary<TKey,TValue> che contiene una raccolta di tutti i parametri predefiniti nel modello. Per altre informazioni sui parametri del modello, vedere Parametri del modello.
Parametro WizardRunKind che contiene informazioni sul tipo di modello in uso.
Matrice Object che contiene un set di parametri passati alla procedura guidata da Visual Studio.
In questo esempio viene aggiunto un valore di parametro dal modulo di input dell'utente al Dictionary<TKey,TValue> parametro . Ogni istanza del
$custommessage$
parametro nel progetto verrà sostituita con il testo immesso dall'utente.
Creare ora UserInputForm. Nel file WizardImplementation.cs aggiungere il codice seguente dopo la fine della
WizardImplementation
classe.public partial class UserInputForm : Form { private static string customMessage; private TextBox textBox1; private Button button1; public UserInputForm() { this.Size = new System.Drawing.Size(155, 265); button1 = new Button(); button1.Location = new System.Drawing.Point(90, 25); button1.Size = new System.Drawing.Size(50, 25); button1.Click += button1_Click; this.Controls.Add(button1); textBox1 = new TextBox(); textBox1.Location = new System.Drawing.Point(10, 25); textBox1.Size = new System.Drawing.Size(70, 20); this.Controls.Add(textBox1); } public static string CustomMessage { get { return customMessage; } set { customMessage = value; } } private void button1_Click(object sender, EventArgs e) { customMessage = textBox1.Text; this.Close(); } }
Il modulo di input dell'utente fornisce un modulo semplice per l'immissione di un parametro personalizzato. Il modulo contiene una casella di testo denominata
textBox1
e un pulsante denominatobutton1
. Quando si fa clic sul pulsante, il testo della casella di testo viene archiviato nelcustomMessage
parametro .
Connessione la procedura guidata al modello personalizzato
Per consentire al modello di progetto personalizzato di usare la procedura guidata personalizzata, è necessario firmare l'assembly della procedura guidata e aggiungere alcune righe al modello di progetto personalizzato per comunicare dove trovare l'implementazione della procedura guidata quando viene creato un nuovo progetto.
Firmare l'assembly. Nella Esplora soluzioni selezionare il progetto VSIX, fare clic con il pulsante destro del mouse e scegliere Proprietà progetto.
Nella finestra Proprietà progetto selezionare la scheda Firma. Nella scheda Firma selezionare Firma assembly. Nel campo Scegliere un file di chiave con nome sicuro selezionare <Nuovo>. Nella finestra Crea chiave con nome sicuro digitare key.snk nel campo Nome file chiave. Deselezionare il campo Proteggi il file di chiave con una password .
Nella Esplora soluzioni selezionare il progetto VSIX e trovare la finestra Proprietà.
Impostare il campo Copia output compilazione su Directory di output su true. Ciò consente di copiare l'assembly nella directory di output quando la soluzione viene ricompilata. È ancora contenuto nel
.vsix
file. Per trovare la chiave di firma, è necessario visualizzare l'assembly.Ricompila la soluzione.
È ora possibile trovare il file key.snk nella directory del progetto MyProjectWizard (<percorso> del disco\MyProjectTemplate\MyProjectWizard\key.snk). Copiare il file key.snk .
Passare alla directory di output e trovare l'assembly (<percorso> disco\MyProjectTemplate/MyProjectWizard\bin\Debug\MyProjectWizard.dll). Incollare il file key.snk qui. Questa operazione non è assolutamente necessaria, ma renderà più semplice la procedura seguente.
Aprire una finestra di comando e passare alla directory in cui è stato creato l'assembly.
Trovare lo strumento di firma sn.exe . Ad esempio, in un sistema operativo Windows 10 a 64 bit, un percorso tipico sarà il seguente:
C:\Programmi (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
Se non è possibile trovare lo strumento, provare a eseguire dove /R . sn.exe nella finestra di comando. Prendere nota del percorso.
Estrarre la chiave pubblica dal file key.snk . Nella finestra di comando digitare
<percorso di sn.exe>\sn.exe -p key.snk outfile.key.
Non dimenticare di racchiudere il percorso di sn.exe tra virgolette se sono presenti spazi nei nomi delle directory.
Ottenere il token di chiave pubblica dal file outfile:
<percorso di sn.exe>\sn.exe -t outfile.key.
Anche in questo caso, non dimenticare le virgolette. Nell'output dovrebbe essere visualizzata una riga simile alla seguente
Il token di chiave pubblica è <token>
Prendere nota di questo valore.
Aggiungere il riferimento alla procedura guidata personalizzata al file vstemplate del modello di progetto. Nella Esplora soluzioni trovare il file denominato MyProjectTemplate.vstemplate e aprirlo. Dopo la fine della <sezione TemplateContent> , aggiungere la sezione seguente:
<WizardExtension> <Assembly>MyProjectWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=token</Assembly> <FullClassName>MyProjectWizard.WizardImplementation</FullClassName> </WizardExtension>
Dove MyProjectWizard è il nome dell'assembly e il token è il token copiato nel passaggio precedente.
Salvare tutti i file nel progetto e ricompilare.
Aggiungere il parametro personalizzato al modello
In questo esempio, il progetto usato come modello visualizza il messaggio specificato nel formato di input utente della procedura guidata personalizzata.
Nella Esplora soluzioni passare al progetto MyProjectTemplate e aprire Class1.cs.
Main
Nel metodo dell'applicazione aggiungere la riga di codice seguente.Console.WriteLine("$custommessage$");
Il parametro
$custommessage$
viene sostituito con il testo immesso nel modulo di input dell'utente quando viene creato un progetto dal modello.
Di seguito è riportato il file di codice completo prima dell'esportazione in un modello.
using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;
namespace $safeprojectname$
{
public class Class1
{
static void Main(string[] args)
{
Console.WriteLine("$custommessage$");
}
}
}
Usare la procedura guidata personalizzata
È ora possibile creare un progetto dal modello e usare la procedura guidata personalizzata.
Ricompilare la soluzione e avviare il debug. Verrà visualizzata una seconda istanza di Visual Studio.
Creare un nuovo progetto MyProjectTemplate. (File>New>Project).
Nella finestra di dialogo Nuovo progetto cercare "myproject" per individuare il modello, digitare un nome e fare clic su OK.
Verrà aperto il modulo di input dell'utente della procedura guidata.
Digitare un valore per il parametro personalizzato e fare clic sul pulsante .
Il modulo di input dell'utente della procedura guidata viene chiuso e viene creato un progetto dal modello.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul file del codice sorgente e scegliere Visualizza codice.
Si noti che
$custommessage$
è stato sostituito con il testo immesso nel modulo di input dell'utente della procedura guidata.