7

Ich habe Probleme mit meinem Visual Studio Template Wizard's GUI angezeigt. Ich folgte diesen Schritten: http://msdn.microsoft.com/en-us/library/ms185301.aspxVS2012 Template Wizard - GUI wird nicht angezeigt

Hier ist, was ich getan habe:

1) eine C# Klassenbibliothek generiert (DLL) mit den folgenden Dateien:

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) Ein Benutzereingabeformular mit einem Eingabefeld und einem Kombinationsfeld mit Code UserInputForm.cs wurde hinzugefügt.

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) einen öffentlichen/privaten starken Schlüssel generierten und die Baugruppe aus den "Unterzeichnung" Registerkarte in der Eigenschaftsseite registriert

4) Veröffentlichung generiert die DLL

5) registrierte es mit gacutil/i mydllname. dll, keine Fehler

6) Erstellt eine C++ Konsole Projektvorlage mit nur einer Datei:

#include <iostream> 
using namespace std; 


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

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

    return 0; 
} 

7) Exportieren als Vorlage Projekt (nicht Artikel) mit Checkbox auf "Import automatisch in vs". Modifizierte in der zip die .vstemplate Datei wie diese Datei:

<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> 

Leider wenn ich versuche, eine neue Vorlage Projekt erstellen die Benutzeroberfläche wird nicht angezeigt. Das Projekt wird gerade geöffnet und es gibt keine Ersetzung des Parameters $ custommessage $.

Warum kann ich die Benutzeroberfläche meines Assistenten nicht anzeigen?

Zusätzlich: gibt es eine Möglichkeit zu debuggen, warum die Baugruppe nicht geladen wird ??

Antwort

1

hatte ich das gleiche Problem wie die OP, nach dem gleichen Tutorial.

Die Lösung fand ich, war dies:

Im die Vorlage Abschnitt ändern,

Schritt 2 Entpacken Sie die ZIP-Datei in einen Ordner und die Zip-Datei löschen. Dann modifiziere das vstemplate.

Schließlich versuchen Sie den Assistenten in einer neuen Instanz von VS.

Ich weiß nicht, ob das die richtige Lösung ist, aber das ist, was für mich funktionierte.

+0

Ich musste viele Tricks und Maschinen machen, aber ich habe es endlich zur Arbeit gebracht. Danke, Paresh, obwohl du mir nur einen Hinweis gegeben hast, habe ich es endlich funktioniert. –

+0

Gerne helfen :) – Paresh138

1

Wahrscheinlich wurde die Assembly mit der Wizard-Implementierung nicht gefunden.

Im Abschnitt WizardExtension sollten Sie genau Ihren Assembly- und Klassennamen schreiben.

Natürlich sollte diese Assembly im Erweiterungsverzeichnis sein oder in GAC registriert sein.

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

Danke, Serge

+0

Ich registrierte es mit gacutil.exe wie oben beschrieben und bekam keine Fehler "Assembly erfolgreich registriert". In Bezug auf die Wizardextension bin ich mir bei der Kultur nicht hundertprozentig sicher (die Versammlung sagt "keine"), aber ich denke, dass Neutral das Gleiche ist. Das Token ist aktuell, der Assemblyname ist mit dem Namen des Hauptnamespaces identisch, FullClassname ist der Assemblyname. IWizardImplementation (meine UI-Klasse) –

+0

Sie können einige Ausnahmen abfangen, wenn vorhanden: 1) öffnen Sie den neuen Projektdialog in der ersten Instanz von VS2012, 2) öffnen Sie die zweite Instanz von VS2012 3) anfügen Debugger von der zweiten Instanz von VS2012 an die erste Instanz, 4) Aktivieren Sie Ausnahmen in der zweiten Instanz von VS2012, 5) Versuchen Sie ein neues Projekt in der ersten Instanz von VS2012 zu erstellen Wenn es Ausnahmen gibt, werden Sie in der zweiten Instanz von VS2012 – TSV

+0

Versucht sehen Dies hat aber nichts als diese Ausnahme: "Wert nicht in den erwarteten Bereich fallen". Leider verstehe ich nicht, auf welchen Bereich/Wert es sich bezieht. Wenn Sie einen einfachen Assistenten für vs2012 mit einem Vorlagenprojekt erstellen und es mir zippen können, wäre ich dankbar, damit ich überprüfen kann, wo ich falsch liege. Dies sollte eine 5-minütige Aufgabe sein, die den obigen Schritten folgt und sicherstellt, dass ich nichts falsch gemacht habe. –