2013-04-26 7 views
11

Ich möchte eine benutzerdefinierte Elementvorlage erstellen, die einen Assistenten (IWizard-Schnittstelle) enthält.Verwenden von IWizard in einer Artikelvorlage, ohne Assembly in GAC zu installieren?

Unter http://msdn.microsoft.com/en-us/library/vstudio/ms171411%28v=vs.100%29.aspx und einigen anderen Orten wird immer beschrieben, dass die Assembly, die den Assistenten enthält, in GAC installiert werden muss. Ich möchte meine Vorlage in meiner Organisation verteilen, und nicht jeder hat das Recht, irgendetwas in GAC zu installieren.

So frage ich mich, gibt es keine Möglichkeit, die Assembly, die den Wizard-Code in der Vorlage Zip oder Vsix-Datei enthalten?

Es scheint mir, dass dies ein häufiges Problem sein sollte?

Gibt es Hilfe beim Verteilen eines benutzerdefinierten Assistenten und einer Elementvorlage ohne GAC-Installationen?

Antwort

18

Nach viel Forschung habe ich einen Weg gefunden, das zu tun. Mit dieser Methode ist es möglich, die Assembly mit der IWizard-Implementierung in die VSIX-Datei aufzunehmen, auch ohne sie zu signieren und zur Laufzeit verfügbar zu haben. Keine Notwendigkeit, mit dem GAC herumzuspielen.

Sie müssen 3 Projekte in Ihrer Lösung

  1. das VSIX Projekt (wir nennen es My Extension)
  2. ein Element Template-Projekt (wir nennen es MyTemplate)
  3. eine regelmäßige Klassenbibliothek Projekt für den Assistenten-Code (wir nennen es MyWizardImpl)

Innerhalb von MyWizardImpl müssen Sie die IWizard-Schnittstelle in einer Arbitrary-Klasse implementieren. (Wir nennen es MyWizardImpl.ItemTemplateWizard1). Wenn diese Zusammenstellung, erhalten Sie als Ausgabe

<solutiondir>\MyWizardImpl\bin\Debug\MyWizardImpl.dll 

nun in MyTemplate \ MyTemplate.vstemplate, müssen Sie es referenzieren

<WizardExtension> 
    <Assembly>MyWizardImpl</Assembly> 
    <FullClassName>MyWizardImpl.ItemTemplateWizard1</FullClassName> 
</WizardExtension> 

Der schwierige Teil kommt zuletzt: Einschließlich der Baugruppe im Inneren des VSIX in ein So kann es geladen werden, wenn ItemTemplate angewendet wird.

  • Erstellen Sie einen Ordner My Extension \ Baugruppen
  • in dem Solution Explorer den Ordner der rechten Maustaste und wählen Sie Add -> Existing Item ...
  • Im "Vorhandenes Element hinzufügen" -Dialog, navigieren Sie zu dem erstellt MyWizardImpl.dll. Klicken Sie auf den kleinen Pfeil und wählen Sie "Als Verknüpfung hinzufügen" (um zu verhindern, dass VS eine Kopie der DLL erstellt)
  • Wählen Sie in den Eigenschaften für diese Verknüpfung BuildAction = Inhalt, IncludeInVSIX = True
  • öffnen Sie die vsixmanifest in einem XML-Editor (oder Notepad) und fügen Sie eine Montagelinie auf den Abschnitt

Beispiel:

<Content> 
    <Assembly AssemblyName="MyWizardImpl">Assemblies\MyWizardImpl.dll</Assembly> 
</Content> 

Erstellen und testen Sie die Lösung, sollte der Assistent Code jetzt ausgeführt werden, wenn die Verwendung von Vorlage.

Wenn Sie mehr als eine Vorlage in Ihrem vsix benötigen, müssen Sie nur zusätzliche ItemTemplate-Projekte hinzufügen. Alle Assistenten können in dieselbe MyWizardImpl-Assembly gehen.

+8

Die Ausgabe eines Projekts als Element in einem anderen Projekt ist im Allgemeinen spröde, und in diesem Fall gibt es einen besseren Weg, damit umzugehen. Sie können die Klassenbibliothek Assembly als Asset zum VSIX-Projekt hinzufügen: Öffnen Sie source.extension.vsixmanifest und wählen Sie die Registerkarte "Assets", dann klicken Sie auf "New", wählen Sie Typ "Assembly", Quelle "Ein Projekt in der aktuellen Lösung", und schließlich das Projekt auswählen. In diesem Dialogfeld befindet sich ein Feld mit der Bezeichnung "In diesen Ordner einbetten": Fügen Sie dort einfach "Assemblies" ein. Das Endergebnis wird genau das selbe sein, aber es wird MSBuild Abhängigkeitsverfolgung usw. nicht abwerfen. –

+1

Ich denke, es gibt keine Registerkarte "Assets" in VS2010 – aaron

+0

@aaron Es heißt "Inhalt" in VS2010 –

Verwandte Themen