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.