2016-09-10 6 views
0

私は、検出されたバージョンに基づいて適切なDLLを動的にロードするVisual Studioの複数のバージョンに対して1つのVSIX拡張機能を使用する方法を使用しています。これは私の拡張機能のほとんどの部分でうまく動作しますが、私のCodeLensエクステンションでは問題ありません。CodeLensを含むマルチターゲティングVSバージョン拡張機能の作成

VisualLスタジオの1つのバージョンをターゲットにしてメインプロジェクトに入れると、CodeLensの部分がうまく動作しますが、動的に組み込まれたDLLの一部として配置すると正しく動作しません。これは、Visual StudioがCodeLensクラス(DataPointsなど)を検出するために実行するものは、拡張機能がDLLをロードする前、またはMEFではなく最初にロードされたDLLでリフレクションを使用しているためです。

だから、誰でも正常に動作するように管理していますか?私が気付いているCodeLensを含む唯一の拡​​張はCode Healthであり、異なるバージョンのVisual Studioのインストールが異なります。

答えて

0

これが機能するには、いくつかのことが必要です。

彼らは、(例えば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;SatelliteDllsProjectOutputGroupOutput 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

関連する問題