6

Visual sudio 2010 に新しいプログラミング言語を追加することを検討していますが、最善のアプローチについて少し混乱しています。

MPF を調べたところ、構文の強調表示、外部パーサーのリンクなどの方法に関するいくつかの例が見つかりましたが、それはかなり簡単に思えます。

次に、MEF と呼ばれるものと、それがビジュアル スタジオの新しい拡張モデルである方法について読みました。私はそれをいじってみましたが、いくつかのサンプルに従って、構文の強調表示が機能するようになりました。さて、MEF では、ParseSOURCE を使用する MPF などのように、自分の言語のパーサーでどのようにリンクするかについて迷っています。私は ANTLR を使用しています。

MEF は、強調表示、装飾などのエディターの視覚的側面のためだけのものですか?それとも言語サービスを実装することは可能/推奨されますか?

私が収集したものから、MEF は新しい推奨されるアプローチですが、通常の MPF よりも新しい言語を作成するのは難しいようです。MPF はまだ良いアプローチですか?

4

3 に答える 3

5

MEF (Managed Extensibility Framework)は、Visual Studio などのプログラムを拡張するための .NET での一般的なプログラミング アプローチです。VS パッケージ/拡張機能は、MPF クラスの代わりに新しい VS-MEF クラス (コントラクト) を使用できます。[Export]MEF は、属性で装飾されたクラスによって認識されます。一般に、色付け可能なアイテムのような特定のクラスを継承し、それを Visual Studio にエクスポートすると、MEF パッケージ内のすべてのエクスポートが検索されてインポ​​ートされます。

MPF (マネージド パッケージ フレームワーク)は、非マネージド/ネイティブ VS 拡張モデルの古い COM ラッパーのクラス システムのようなものです。サービスを取得して MPF クラスのメソッドを実装することにより、Visual Studio をプログラムで拡張します (MPF クラスは、VS の COM ラッパーの COM に似たインターフェイスをLanguageService実装IVsLanguageInfoします。LanguageService実装クラスでオーバーライドできるインターフェイス)。

完全なプログラミング言語を実装する場合は、MPF と MEF を組み合わせます。トークン化 (構文の強調表示に必要)、アウトライン、ブレース マッチングなどのエディター部分には MEF を使用し、新しいツール ウィンドウ、プロパティ ページなどの他の VS 要素には MPF を使用します。

MPF の代わりに、古い COM ラッパーを使用することもできますが、MPF クラスは、COM ラッパーを選択した場合に対処しなければならない COM 処理を既に実行しています。

MPFでトークナイザーなどを実装することもできますが、試してみたところ、MEFよりもはるかに直感的ではありません。あなたが私に尋ねると、それはMEFよりもはるかに難しく、より多くの脳損傷を必要としますが、MPFで得たほどMEFで得られたものはまだありません.

気が付いたようにMSDNはMEFとMPFの記事を混同しているので、私自身は少し混乱しています。MSDN のどのサブセクションに移動するかを注意深く監視する必要があります。誤って MEF カテゴリから MPF に簡単に切り替えることができます。ただし、 MSDNは、VS の拡張に関するいくつかの一般的な記事で、何が何であるかについてヒントを与えています。

于 2014-06-16T11:23:24.437 に答える
1

私は現在、MEF(VS2013)のみで言語サービスを実装しています。

構文の強調表示 ( で実行できますITagger<ClassificationTag>) と、必要に応じて実装する他のいくつかの組み込みの特定目的の MEF インターフェイス (オプション ページやさまざまな種類のインテリセンスなど) とは別に、バックグラウンド解析などを行うために、通常IVsTextViewCreationListener、ファイルが開かれたときに何かを実装して実行します。Initializeまたは、パッケージのメソッドをエントリ ポイントとして使用して、プロジェクト階層をバックグラウンドでトラバースすることもできます。

Intellisense 機能などでは、多くの場合、特定のコマンドに応答する必要があります (または、キーストロークを監視して、補完リスト ボックスをポップアップするタイミングを知るなど)。これは、関連するコマンドを実装して処理することで処理できます (テキスト ビューの作成時にを呼び出して、IOleCommandTargetコマンド ハンドラーを手動でフックします)。AddCommandFilterIVsTextView

これまでのところ、MEF を介してできないこと (まったくできないことを除いて) に遭遇したことはありません。MPF は必要なかったので、実際に調べたことはありませんでした。

(結局のところ、コードは MEF 配管、VS SDK インターフェイスとヘルパー クラス、および EnvDTE グループのスープに似ている傾向があることに注意してください。)

于 2014-06-16T21:44:34.177 に答える