2012-05-30 76 views
6

我正在考慮添加一個新的編程語言到視覺sudio 2010,我對最好的方法有點困惑。Visual Studio 2010 MEF vs MPF?

我看了一下MPF,發現了一些關於如何進行語法高亮顯示,鏈接外部分析器等的例子,它看起來非常簡單。

然後我讀了一些關於MEF的內容,以及它如何成爲Visual Studio的新的可擴展性模型。我已經玩過它了,並且通過跟蹤一些樣本來突出顯示我的語法。現在,有了MEF,我迷失在我的語法分析器中,就像使用ParseSOurce的MPF等一樣,我正在使用ANTLR btw。

MEF只是用於編輯器的視覺方面,如突出顯示,裝飾等......或者是否有可能/建議用它來實現語言服務?

從我收集的資料可以看出,MEF是一種新的推薦方法,但與普通MPF相比,創建新語言似乎更困難。強積金仍然是一個好方法嗎?

+3

其中一個最好的方法是研究當前項目如何實現它。試着看看IronPython和「Visual Studio的Python工具」,看看它們如何將對python語言的支持添加到VS. –

+0

這個問題仍然缺少一個可接受的答案。我的回答是否有助於您,還是您需要更多詳細信息? = 3 –

+0

哎呀,我已經忘記了這一點,這是一段時間後。謝謝你的回答非常有幫助,我參加了強積金路線。 –

回答

4

MEF(託管擴展框架)是.NET中用於擴展程序的一般編程方法,如Visual Studio。 VS包/擴展可以使用較新的VS-MEF類(合同)而不是MPF類。 MEF被具有[Export]屬性的類裝飾。一般來說,您繼承了一個特定的類,如可着色項目並將其導出到Visual Studio,然後查找MEF包中的所有導出並導入它們。

MPF(託管包框架)就像圍繞非託管/本地VS擴展模型的較早COM包裝的類系統。您可以通過獲取服務並實現MPF類的方法來以編程方式擴展Visual Studio(MPF類依次實現VS的COM包裝的類COM接口。例如LanguageService實現IVsLanguageInfo和其他一些接口,但它只是簡單地「收集」方法這些接口可以在您的LanguageService實現類中覆蓋)。

如果你想實現一個完整的編程語言,你將結合MPF和MEF。您使用MEF編輯器部分(如語法突出顯示所需的),大綱,大括號匹配等,以及用於其他VS東西(如新工具窗口,屬性頁等)的編輯器部分。

代替MPF,您也可以使用舊的COM包裝器,但是MPF類已經爲你做了一些COM工作,如果你選擇了COM包裝器,你將不得不處理這些工作。

你也可以用MPF實現tokenizer等,但我試過了,發現它比MEF更不直觀。如果你問我的話,那就更困難了,而且需要比MEF更多的冒險精神,但是我還沒有像MEF那樣得到MEF。

這讓我感到有點困惑,因爲我注意到MSDN混合了MEF和MPF的文章。您需要非常仔細地觀察MSDN的哪個子部分,您可以輕鬆地從MEF類別切換到MPF。 但是,MSDN提示你關於擴展VS的一些常規文章中的內容是什麼,例如:http://msdn.microsoft.com/en-us/library/cc138569.aspx

0

我目前正在使用MEF(在VS2013中)專門實現語言服務。

除了語法突出顯示(您可以使用ITagger<ClassificationTag>)和其他一些內置的特定用途MEF接口(例如,對於選項頁面和各種類型的智能感知),您可以根據需要執行這些操作,例如執行背景解析等操作,通常會執行IVsTextViewCreationListener並在文件打開時執行某些操作;或者,您可以使用套件的Initialize方法作爲入口點在後臺遍歷項目層次結構。

智能感知功能等通常會要求您響應某個命令(或監視擊鍵以瞭解何時彈出完成列表框);您可以通過執行IOleCommandTarget並處理相關命令(通過在創建文本視圖時通過在IVsTextView上調用AddCommandFilter手動掛接您的命令處理程序)來處理此問題。

到目前爲止,我還沒有遇到任何我無法通過MEF做的事情(除了無法完成的事情);我從來沒有真正看過MPF,因爲我不需要它。

(請注意,在這一天結束時,代碼往往像MEF管道,VS SDK接口和輔助類和EnvDTE GOOP的湯。)

0

使用MEF對於其通過暴露特徵MEF。其他功能則根據具體情況進行處理(如果您在實施特定功能時遇到問題,請提出具體問題)。我仍然使用MPF的唯一項目是項目系統(項目MPF,或MPFProj)。爲了處理背景解析,我建議看看我的BackgroundParser實現(MIT許可證)。它工作得很好,雖然回頭看,我希望我使用TPL,並使ReParseImpl返回Task,而不是同步執行。