2010-04-15 34 views
9

Estoy tratando de añadir plugins para mi juego y lo que estoy tratando de poner en práctica es la siguiente:¿Cómo implementar correctamente los complementos en C#?

  • plugins será ya sea la mía o la tercera parte de lo que me gustaría una solución donde estrellarse del plugin haría no significa colisión de la aplicación principal.

  • Los métodos de complementos se llaman con mucha frecuencia (por ejemplo, debido al dibujo de objetos del juego).

Lo que he encontrado hasta ahora:

Podría por favor comentar sobre mis resultados? ¡Nuevos enfoques también son bienvenidos! ¡Gracias!

Respuesta

9

Puede definir una interfaz pública que el complemento debe implementar. Luego, con el uso de la reflexión puede escanear una carpeta de "complementos" para cualquier clase que implemente esa interfaz, luego cree una instancia de esa clase.

De tu código solo trabajas en la interfaz y llamas a los métodos necesarios. Acerca del bloqueo, siempre asegúrese de que las llamadas a la interfaz "complemento" siempre estén encapsuladas en un bloque try/catch. Si ocurre una excepción, siempre puede disponer del complemento

+0

Gracias, estás hablando de mi punto 1) que usa bastante lo mismo que dijiste. Estaba pensando en probar/atrapar bloques también (http://stackoverflow.com/questions/52312/what-is-the-real-overhead-of-try-catch-in-c - no se necesita una sobrecarga significativa). –

+0

@MartyIX Normalmente, la mejor práctica es evitar el uso de bloques de prueba/captura para operaciones "normales". Pero como no tienes ningún control sobre el código del complemento, no puedes confiar en él fuera de un bloque try/catch. – Jasper

1

El extensible "secreto" a la extensión de .NET es: carga dinámica (para obtener el complemento en el dominio de la aplicación), Reflexión (para verificar que sea compatible con los métodos/interfaz que especifique) , Atributos (para obtener metadatos para cosas como versionar), Enlace tardío (para usar realmente el complemento).

Si sus necesidades de extensibilidad son muy simples o muy únicas, debería considerar implementarlas a su manera.

1

Utilicé this tutorial como base para mi propia arquitectura de complemento hace un par de años.Mi arquitectura era, creo, una arquitectura relativamente simple, pero tuve algunos problemas cuando se trataba de pasar mensajes entre complementos.

Si tiene la intención de escribir su propia arquitectura, entonces es suficiente, pero me gustaría advertir en contra. No es una empresa pequeña, y tarde o temprano te encontrarás con algunas consideraciones de diseño importantes, como el envío de mensajes, que no son triviales de resolver (si bien simultáneamente son bastante interesantes y frustrantes). Hay una gran cantidad de valor en el uso de algo como MEF que resuelve estos problemas para usted, y proporciona una API y un marco realmente agradables sobre los cuales puede construir sus complementos.

Además, MEF terminará distribuyéndose como parte de su aplicación, por lo que no necesita que sus usuarios lo descarguen por separado; es una dependencia "invisible" en lo que a ellos respecta, y una de peso ligero para los desarrolladores, incluido usted mismo. También es la arquitectura oficial de plug-ins para Visual Studio 2010, por lo que tiene mucho peso en la comunidad .NET, y solo habrá más desarrolladores capaces de escribir complementos para tu aplicación si la usas también.

Espero que tenga algún sentido.

+0

¡Gracias por el enlace! Bueno, la comunicación entre complementos puede ser un problema, pero mi juego no es tan complicado (espero :)). Pensaré en MEF. –

2

que sospecha que sus dos requerimientos de:

  1. un rendimiento rápido con objetos de dibujo y
  2. un accidente plugin no se estrellaría su aplicación

van a conflictos.

Para garantizar realmente que un complemento con errores no interrumpa su aplicación, debe cargarla en un dominio de aplicación separado (como ya ha identificado). Pero vas a tener un golpe de rendimiento, ya que el objetivo de AppDomains es aislar instancias de objetos. Así que, como mínimo, tendrá que serializar argumentos para sus complementos (posiblemente utilizando objetos MarshalByRef o Remoting). Y sospecho que eso significará serializar una buena parte del estado de tu juego (que parece que al menos consiste en algún tipo de imagen). En el lado positivo, AppDomains vive en el mismo espacio de proceso, por lo que la sobrecarga no es tan mala como la comunicación entre procesos.

La descarga de complementos es tan simple como descargar AppDomain.

Como tiene que serializar argumentos, puede hacer la validación de su estado del juego una vez que el complemento lo haya procesado.

Jugué un par de veces con AppDomains. En mi experiencia, toma unos segundos construir uno. Eso puede afectar la cantidad de complementos que carga en cada AppDomain.

+0

¡Gracias por tu comentario! Parece demasiado sobrecargado para mi aplicación. Usar un AppDomain con bloques try/catch como sugirió Jasper parece ser bueno para mi juego. –

Cuestiones relacionadas