これが機能するには、いくつかのことが必要です。
彼らは、(例えばMyExtension.v14
をサポートMyExtension.v15
やアセンブリの特定のバージョンを参照するが、他の点では同じであるコードを含む、そこにバージョン固有のコードを入れなければならないのVisual Studioのバージョンを含む名前の2クラスライブラリプロジェクトを作成します。
をあなたのCodeLensクラスをそこに移動しますが、クラスに異なる名前を付けます(そうでなければ、1つはバージョンを隠し、MEFはVisual Studioの1つのバージョンでのみ機能します)。もう1つはクラス名を置き換えました
あなたのvsixマニフェストファイルに2 Mef各ライブラリプロジェクトを指し示すコンポーネントアセットエントリ。
リファレンスメインプロジェクトから、あなたのライブラリプロジェクトを、しかし、参照エントリの下False
からReference Output Assembly
設定し、パッケージの起動コードでDebugSymbolsProjectOutputGroup;
にBuiltProjectOutputGroup;BuiltProjectOutputGroupDependencies;GetCopyToOutputDirectoryItems;SatelliteDllsProjectOutputGroup
とOutput Groups Included in VSIX (Local Only)
にOutput Groups Included in VSIX
を設定するには、どこかにVSのバージョンのランニングを検出し、ロード適切なアセンブリ:バージョン固有のDLLはまた、私は他の機能のために必要なタイプを含めてMEFが動作するために、この最後のステップは必要とされないことがあり
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"));
}
、しかし私はそれを必要と私のパッケージの中に。
CIなどが機能し、おそらくコードレンズ拡張に特有のものであるためには、コンピュータ上のフォルダを参照するのではなく、バージョン固有のDLLをソリューションアイテムとして追加して参照してください。
参照のために、私が拡張機能を複数のバージョンでサポートするためのほとんどの作業を行ったチェンジセットhereを参照してください。参照先の問題を変更したばかりのスナップショットでソートした後続のチェンジセットを参照してください。here