2016-09-10 1 views
0

J'utilise une méthode pour avoir une extension VSIX pour plusieurs versions de Visual Studio, par laquelle je charge dynamiquement la DLL appropriée en fonction de la version détectée. Cela fonctionne très bien pour la plupart des parties de mon extension, mais pas pour mon extension CodeLens. La partie CodeLens fonctionne correctement lorsque je cible une version de Visual Studio et la place dans le projet principal, mais pas quand je la mets dans la DLL incluse dynamiquement. Je crois que c'est parce que tout ce que Visual Studio exécute pour détecter les classes CodeLens (DataPoints etc.) est en cours d'exécution avant que mon extension ne charge la DLL, ou utilise la réflexion sur les DLL initialement chargées, pas MEF.Création d'une extension de version VS à ciblage multiple incluant CodeLens

Alors, est-ce que quelqu'un a réussi à faire fonctionner cela? La seule extension qui inclut CodeLens que je connais est Code Health et qui a différentes installations pour différentes versions de Visual Studio.

Répondre

0

Il y a plusieurs choses qui doivent être en place pour que cela fonctionne.

Créer 2 projets de bibliothèque de classe nommée, y compris la version de Visual Studio, ils devraient soutenir (par exemple MyExtension.v14, MyExtension.v15 et la version mettre du code spécifique là-dedans, y compris le code qui fait référence à des versions spécifiques des assemblées, mais est par ailleurs identique.

Déplacez vos classes CodeLens là, mais nommez les classes différemment (sinon une version cachera l'autre et MEF fonctionnera seulement pour une version de Visual Studio.) Dans mon projet j'ai ajouté des modèles de texte à un des projets qui lisaient les fichiers cs de l'autre et a remplacé les noms de classe

Dans votre fichier manifeste vsix ajouter 2 Mef Entrées d'élément de composant, pointant vers chacun de vos projets de bibliothèque.

Référence vos projets de bibliothèque du projet principal, mais sous l'entrée de référence fixé Reference Output Assembly-False et mettre Output Groups Included in VSIX-BuiltProjectOutputGroup;BuiltProjectOutputGroupDependencies;GetCopyToOutputDirectoryItems;SatelliteDllsProjectOutputGroup et Output Groups Included in VSIX (Local Only) à DebugSymbolsProjectOutputGroup;

En démarrage le code de votre paquet détecter quelque part la version VS course et charger la assemblage approprié:

private int GetMajorVsVersion() 
{ 
    var dte = (EnvDTE.DTE)GetService(typeof(EnvDTE.DTE)); 
    Version version; 
    if (Version.TryParse(dte.Version, out version)) 
    { 
     return version.Major; 
    } 
    return 15; 
} 
private Assembly GetVersionedAssembly() 
{ 
    return Assembly.LoadFrom(Path.Combine(Path.GetDirectoryName(typeof(MyExtensionPackage).Assembly.Location), $"MyExtension.v{GetMajorVsVersion()}.dll")); 
} 

Cette dernière étape peut ne pas être nécessaire pour travailler MEF, mais je avais besoin que la version DLL spécifiques également inclus les types I nécessaires pour d'autres fonctionnelle dans mon colis. Pour que CI etc. fonctionne, et probablement spécifique aux extensions de code-objectif, ajoutez les DLL spécifiques à la version en tant qu'éléments de solution, et référencez-les, plutôt que de référencer un dossier sur votre ordinateur.

Pour référence voir le changeset here où j'ai fait la plupart du travail pour rendre l'extension supportant plusieurs versions. Voir les changesets suivants où j'ai trié le problème de référencement avec un instantané de celui-ci travaillant après avoir fait les changements here.