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:
1) http://www.codeproject.com/KB/cs/pluginsincsharp.aspx - concepto simple que parece que debería funcionar muy bien. Como los complementos se usan en mi juego para cada ronda, bastaría con agregar el método Restart() y, si ya no se necesita un complemento, el método Unload() + GC debería encargarse de eso.
2) http://mef.codeplex.com/Wikipage - Managed Extensibility Framework - mi programa debería funcionar en .NET 3.5 y no quiero agregar ningún otro framework por separado. Quiero escribir mi propio sistema de complementos. Por lo tanto, esta solución está fuera de duda.
3) Microsoft proporciona: http://msdn.microsoft.com/en-us/library/system.addin.aspx pero de acuerdo con algunos artículos que he leído es muy complejo.
4) AppDomains diferentes para complementos. Según Marc Gravell (Usage of AppDomain in C#) diferentes AppDomains permiten el aislamiento. La descarga de complementos sería fácil. ¿Cuál sería la carga de rendimiento? Necesito llamar métodos de complementos muy a menudo (para dibujar objetos, por ejemplo).
El uso de dominios de aplicación - http://msdn.microsoft.com/en-us/library/yb506139.aspx
Podría por favor comentar sobre mis resultados? ¡Nuevos enfoques también son bienvenidos! ¡Gracias!
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). –
@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