10

Ich verwalte eine unternehmensinterne Visual Studio-Erweiterung, die als VSIX-Container verpackt und bereitgestellt wird. Diese Erweiterung ist derzeit auf VS 2010 ausgerichtet. Sie verwendet mehrere VS API-DLLs und verweist auf die VS 2010-Versionen.So packen Sie eine VSIX-basierte Erweiterung für mehrere Visual Studio-Versionen

Ich migriere derzeit diese Erweiterung, um mit VS 2012/2013 kompatibel zu sein. Ich habe bereits herausgefunden, dass das alte VSIX-Manifest manuell bearbeitet werden kann, damit die Erweiterung zusätzlich zu VS 2012/2013 installiert werden kann - das funktioniert einwandfrei.

Allerdings sind einige der VS 2010-APIs, die ich derzeit verwende, nicht mit VS 2012 ++ kompatibel, und ich muss sie aktualisieren - mit dem Effekt, dass die Abwärtskompatibilität aufgegeben wird.

Meine Frage ist: Wie soll ich meine Lösung und VSIX so strukturieren, dass sie mit VS 2010, 2012 und 2013 kompatibel ist. Würde es funktionieren, eine DLL auf VS 2010 und eine DLL auf VS 2012/2013 auszurichten Wählen Sie den zur Verlängerung der Ladezeit zu verwendenden aus?

Seitliche Anmerkung: Ich verwende MEF, um meine internen Funktionseinheiten zu bilden. Erleichtert das in irgendeiner Weise?

+0

Gute Frage, ich hätte auch gerne eine Antwort darauf! – Flynn

+0

Soweit ich recherchiert habe, ist es über Manifest-Datei nicht möglich. Es kann möglich sein, es durch Code zu tun, aber ich denke nicht, dass es machbar ist. – edokan

Antwort

5

Sie können:

  1. entkoppeln die Funktionalität durch die beiden versionsspezifischen Baugruppen in eine exponierte Ad-hoc-Schnittstelle (die Sie selbst in die Wirts Montage setzen können, wenn Sie möchten), wie Sie können mache mit jedem anderen MEF-Plugin; nennen wir es IDoWork;
  2. implementieren Sie die oben genannte Schnittstelle in zwei konkreten Typen, ausgesetzt von zwei verschiedenen Baugruppen, eine für jede VS-Version, die Sie unterstützen, z. DoWorkVs2010 und DoWorkVs2012;

    • AssemblyForVS2010.dll -> DoWorkVs2010: IDoWork
    • AssemblyForVS2012.dll -> DoWorkVs2012: IDoWork

. 3. (optional) [Export] die beiden Typen, um sie über MEF verfügbar zu machen; zB:

[Export(typeof(IDoWork))] 
    class DoWorkVs2010 : IDoWork 
    { 
     // ... 
    } 

4. eine Fabrik zu Ihrem Host-Assembly hinzufügen (die direkt mit Ihrem VSX geladen) und von dort beim Aufbau der konkreten Typ Sie suchen, basierend auf der DTE-Version:

static class DoWorkFactory 
    { 
     internal static IDoWork Build() 
     { 
      // Load the version-specific assembly 

      // - Via reflection (see http://stackoverflow.com/a/465509/904178) 
      // - Or via MEF 

      return ...; 
     } 
    } 
+0

Danke Efran. Ich dachte, es gäbe einen einfacheren Weg, um das zu erreichen, aber ich habe es mit einem Ansatz gelaufen, der dem, den du beschreibst, sehr ähnlich ist. –

+0

Gern geschehen, @Florian! :) –

0

Verwenden Sie these VSIX templates von Jared Par. Sie wurden mit dem ausdrücklichen Zweck entwickelt, Ihr VSIX-Projekt in mehreren VS-Versionen installierbar und öffenbar zu machen. Es sieht so aus, als ob sie für VS2015 eine Auffrischung benötigen, aber sie sind definitiv der richtige Ort für die meisten VSIX-Entwicklungen.

Verwandte Themen