2012-05-30 16 views
6

Estoy buscando agregar un nuevo lenguaje de programación a visual sudio 2010 y estoy un poco confundido sobre el mejor enfoque a seguir.Visual Studio 2010 MEF vs. MPF?

He examinado el MPF y he encontrado algunos ejemplos sobre cómo resaltar la sintaxis, vincular un analizador externo, etc., y parece bastante sencillo.

Luego leí sobre algo llamado MEF y cómo es el nuevo modelo de extensibilidad para visual studio. He jugado con eso y tengo mi resaltado de sintaxis funcionando siguiendo algunas muestras. Ahora, con MEF estoy perdido en cómo me enlace en mi analizador para mi lenguaje, como MPF usando ParseSOurce, etc. Estoy usando ANTLR por cierto.

¿Es MEF solo para los aspectos visuales del editor como resaltado, adornos, etc ... o es posible/recomendado implementar servicios de idiomas con él?

De lo que deduzco MEF es el nuevo enfoque recomendado, pero parece más difícil crear un nuevo idioma que con el MPF normal. ¿Sigue siendo el MPF un buen enfoque?

+3

Una de las mejores maneras es estudiando cómo lo hace un proyecto actual. Intente echar un vistazo a IronPython y las "Herramientas de Python para Visual Studio" para ver cómo agregan soporte para el lenguaje python a VS. –

+0

Esta pregunta todavía falta una respuesta aceptada. ¿Te ayudó mi respuesta o necesitas más información? = 3 –

+0

Sí, me había olvidado de esto, fue hace un tiempo. Su respuesta fue muy útil gracias y fui por la ruta MPF. –

Respuesta

4

MEF (Managed Extensibility Framework) es un enfoque de programación general en .NET para extender programas, como Visual Studio. Los paquetes/extensiones VS pueden usar las clases VS-MEF más nuevas (contratos) en lugar de las clases MPF. MEF es reconocido por clases decoradas con atributos [Export]. En general, heredas una clase específica como un elemento colorable y la exportas a Visual Studio, que luego busca todas las exportaciones en tu paquete MEF y las importa.

MPF (Managed Package Framework) es como un sistema de clase alrededor de los envoltorios COM más antiguos del modelo de extensión VS no administrado/nativo. Extiende Visual Studio programáticamente obteniendo servicios e implementando métodos de clases MPF (las clases MPF a su vez implementan interfaces tipo COM de los contenedores COM de VS. Por ejemplo LanguageService implementa y algunas otras interfaces, pero simplemente "recopila" métodos de esa interfaz que luego puede anular en su clase de implementación LanguageService).

Si desea implementar un lenguaje de programación completo, combinará MPF y MEF. Utiliza MEF para las partes del editor como tokenización (que es necesaria para resaltar la sintaxis), delinear, corchete, etc. y MPF para los otros elementos VS, como ventanas de herramientas nuevas, páginas de propiedades, etc.

En lugar de MPF también puede use las envolturas COM más antiguas, pero las clases MPF ya hacen algunos trabajos COM para usted, con lo que tendría que lidiar si elige los envoltorios COM.

También puede implementar el tokenizer etc. con MPF, pero lo probé y lo encontré mucho más intuitivo que MEF. Si me preguntas, es mucho más difícil y requiere más daño cerebral que el MEF, pero aún tengo que llegar tan lejos con MEF como con MPF.

Es un poco confuso para mí porque MSDN mezcla artículos de MEF y MPF como noté. Debe mirar con mucho cuidado en qué subsección de MSDN va, puede cambiar fácilmente de una categoría MEF a MPF por accidente. Sin embargo, MSDN pistas sobre qué-es-lo que en algunos artículos generales sobre la ampliación de VS, por ejemplo aquí: http://msdn.microsoft.com/en-us/library/cc138569.aspx

0

estoy actualmente la implementación de un servicio de idiomas en exclusiva con el MEF (en VS2013).

Además del resaltado de sintaxis (que podría hacer con un ITagger<ClassificationTag>) y algunas otras interfaces MEF de propósito específico incorporadas (p.para páginas de opciones y varios tipos de IntelliSense) que se implemente como sea necesario, para hacer cosas como el análisis de fondo por lo general, implementar IVsTextViewCreationListener y hacer cosas cuando se abre un archivo; Como alternativa, puede atravesar la jerarquía de proyecto en el fondo usando el método de su paquete Initialize como punto de entrada.

Las funciones de Intellisense, etc., a menudo requieren que respondas a un determinado comando (o monitores de teclas para saber cuándo mostrar un cuadro de lista de finalización, por ejemplo); puede manejar esto implementando IOleCommandTarget y manejando los comandos relevantes (conecta su manejador de comando manualmente llamando al AddCommandFilter en el IVsTextView cuando se crea una vista de texto).

Hasta ahora no me he topado con nada que no pueda hacerlo a través del MEF (excepto para las cosas que no se puede hacer nada); Nunca miré realmente a MPF, ya que no lo necesitaba.

(Tenga en cuenta que al final del día, el código tiende a parecerse a una sopa de MEF fontanería, interfaces SDK VS y clases de ayuda, y pegote EnvDTE.)

0

Uso MEF para las características que se exponen a través MEF. Otras características se manejan caso por caso (haga una pregunta específica si tiene problemas para implementar una característica específica). La única cosa que todavía utilizo para MPF es sistemas del proyecto (MPF para los proyectos, o MPFProj). Para manejar el análisis de fondo, recomiendo echar un vistazo a mi BackgroundParser aplicación (licencia MIT). Funciona bastante bien, aunque mirando hacia atrás me gustaría utilizar el TPL para él y hacer ReParseImpl devolver un Task en lugar de ejecutar sincrónicamente.