7

Ho problemi con la visualizzazione della GUI del wizard dello studio visivo. Ho seguito questi passi: http://msdn.microsoft.com/en-us/library/ms185301.aspxProcedura guidata modello VS2012 - GUI non mostrata

Ecco quello che ho fatto:

1) generato una libreria di classi C# (DLL) con i seguenti file:

UserInputForm.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace myprojectvstemplate 
{ 
    public partial class UserInputForm : Form 
    { 
     private string customMessage; 

     public UserInputForm() 
     { 

      InitializeComponent(); 
      MessageBox.Show("here, calling ui"); 
     } 

     public string get_CustomMessage() 
     { 
      return customMessage; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      customMessage = textBox1.Text; 

      this.Dispose(); 
     } 
    } 
} 

2 Aggiunto un modulo di input dell'utente con una editbox e una combobox con codice UserInputForm.cs

using System; 
using System.Collections.Generic; 
using Microsoft.VisualStudio.TemplateWizard; 
using System.Windows.Forms; 
using EnvDTE; 

namespace myprojectvstemplate 
{ 
    public class IWizardImplementation : 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 = inputForm.get_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; 
     } 
    } 
} 

3) generata una chiave forte pubblica/privata e registrato il gruppo dalla scheda "firma" nella pagina delle proprietà

4) di uscita generata la DLL

5) è registrato con gacutil/i mydllname. dll, nessun errore

6) ha creato un modello di progetto console C++ con un solo file:

#include <iostream> 
using namespace std; 


int main(int argc, char** argv) 
{ 

    cout << "Hi hello world:" << "$custommessage$"; 

    return 0; 
} 

7) esportati come un modello di progetto (non voce) con checkbox su "Importa automaticamente in vs". Modificato all'interno del file zip file .vstemplate in questo modo:

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project"> 
    <TemplateData> 
    <Name>myproject_project</Name> 
    <Description>&lt;No description available&gt;</Description> 
    <ProjectType>VC</ProjectType> 
    <ProjectSubType> 
    </ProjectSubType> 
    <SortOrder>1000</SortOrder> 
    <CreateNewFolder>true</CreateNewFolder> 
    <DefaultName>myproject_project</DefaultName> 
    <ProvideDefaultName>true</ProvideDefaultName> 
    <LocationField>Enabled</LocationField> 
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton> 
    <Icon>__TemplateIcon.ico</Icon> 
    </TemplateData> 
    <TemplateContent> 
    <Project TargetFileName="myproject_project.vcxproj" File="myproject_project.vcxproj" ReplaceParameters="true"> 
     <ProjectItem ReplaceParameters="false" TargetFileName="$projectname$.vcxproj.filters">myproject_project.vcxproj.filters</ProjectItem> 
     <ProjectItem ReplaceParameters="true" TargetFileName="myproject_project.cpp">myproject_project.cpp</ProjectItem> 
     <ProjectItem ReplaceParameters="false" TargetFileName="ReadMe.txt">ReadMe.txt</ProjectItem> 
    </Project> 
    </TemplateContent> 
    <WizardExtension> 
    <Assembly>myprojectvstemplate, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=a0a3d031ed112d61</Assembly> 
    <FullClassName>myprojectvstemplate.IWizardImplementation</FullClassName> 
    </WizardExtension> 
</VSTemplate> 

Purtroppo quando si tenta di creare un nuovo modello di progetto l'interfaccia utente non viene visualizzato affatto. Il progetto è appena stato aperto e non vi è alcuna sostituzione del parametro $ custommessage $.

Perché non è possibile visualizzare la GUI del mio wizard?

Inoltre: esiste un modo per eseguire il debug del motivo per cui l'assembly non viene caricato ??

risposta

1

Ho avuto lo stesso problema come OP, seguendo la stessa esercitazione.

La soluzione che ho trovato è stato questo:

Nel modificando la sezione Modello,

Fase 2 estrarre il file zip in una cartella e eliminare il file zip. Quindi modificare il vstemplate.

Infine prova la procedura guidata in una nuova istanza di VS.

Non so se questa è la soluzione corretta, ma questo è ciò che ha funzionato per me.

+0

Ho dovuto fare un sacco di trucchi e macchinari, ma alla fine ho potuto farlo funzionare. Grazie Paresh, anche se mi hai appena dato un suggerimento, alla fine ho funzionato. –

+0

Felice di aiutare :) – Paresh138

1

Probabilmente l'assembly con l'implementazione della procedura guidata non è stato trovato.

Nella sezione WizardExtension è necessario scrivere esattamente il nome dell'assieme e della classe.

Ovviamente, questo assembly deve essere nella directory di estensione o registrato in GAC.

<WizardExtension> 
    <Assembly>myprojectvstemplate, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=a0a3d031ed112d61</Assembly> 
    <FullClassName>myprojectvstemplate.IWizardImplementation</FullClassName> 
</WizardExtension> 

Grazie, Serge

+0

L'ho registrato con gacutil.exe come descritto sopra e non ho ricevuto errori "assembly registrato correttamente". Per quanto riguarda l'estensione del wizard, non sono sicuro al 100% riguardo alla cultura (l'assembly dice "none"), ma penso che Neutral sia la stessa cosa. Il token è aggiornato, il nome dell'assembly è uguale al nome dello spazio dei nomi principale, fullclassname è il nome dell'assembly. IWizardImplementation (la mia classe dell'interfaccia utente) –

+0

È possibile rilevare alcune eccezioni, se presenti: 1) aprire la nuova finestra di dialogo del progetto nella prima istanza di VS2012, 2) aprire la seconda istanza di VS2012 3) collegare il debugger dalla seconda istanza di VS2012 per la prima istanza, 4) abilitare le eccezioni nella seconda istanza di VS2012, 5) provare a creare un nuovo progetto nella prima istanza di VS2012 Se ci sono alcune eccezioni, le vedrai nella seconda istanza di VS2012 – TSV

+0

Provato ma non ha ottenuto nulla tranne questa eccezione: "Il valore non rientra nell'intervallo previsto". Purtroppo non capisco che intervallo/valore si riferisce a. Se riesci a creare un semplice wizard per vs2012 con un progetto di modello e comprimelo, ti sarei grato per poter controllare dove sto sbagliando. Questo dovrebbe essere un compito di 5 minuti seguendo i passaggi precedenti e assicurandosi di non aver sbagliato qualcosa –

Problemi correlati