Sto cercando di aggiungere plug-in per il mio gioco e quello che sto cercando di attuare è questo:Come implementare correttamente i plugin in C#?
plugin sarà o mio o terzo partito quindi vorrei una soluzione in cui crash del plugin sarebbe non significa arresto anomalo dell'applicazione principale.
I metodi dei plugin sono chiamati molto spesso (ad esempio a causa del disegno di oggetti di gioco).
Quello che ho trovato finora:
1) http://www.codeproject.com/KB/cs/pluginsincsharp.aspx - concetto semplice che sembra che dovrebbe funzionare bene. Poiché i plug-in sono utilizzati nel mio gioco per ogni round, è sufficiente aggiungere il metodo Restart() e se un plug-in non è più necessario, il metodo Unload() + GC dovrebbe occuparsene.
2) http://mef.codeplex.com/Wikipage - Managed Extensibility Framework - il mio programma dovrebbe funzionare su .NET 3.5 e non voglio aggiungere nessun altro framework separatamente Voglio scrivere il mio sistema di plugin da solo. Quindi questa soluzione è fuori discussione.
3) Microsoft fornisce: http://msdn.microsoft.com/en-us/library/system.addin.aspx ma in base ad alcuni articoli che ho letto è molto complesso.
4) AppDomain diversi per i plug-in. Secondo Marc Gravell (Usage of AppDomain in C#) diversi AppDomain consentono l'isolamento. Lo scarico di plugin sarebbe facile. Quale sarebbe il carico di prestazioni? Ho bisogno di chiamare metodi di plugin molto spesso (per disegnare oggetti per esempio).
Utilizzando domini applicazione - http://msdn.microsoft.com/en-us/library/yb506139.aspx
la prego di commentare i miei risultati? Nuovi approcci sono anche benvenuti! Grazie!
Grazie, stai parlando del mio punto 1) che utilizza piuttosto lo stesso come hai detto tu. Stavo pensando anche a try/catch blocks (http://stackoverflow.com/questions/52312/what-is-the-real-overhead-of-try-catch-in-c - non è necessario un overhead significativo). –
@MartyIX Normalmente la procedura migliore è evitare di utilizzare i blocchi try/catch per le operazioni "normali". Ma dal momento che non hai alcun controllo sul codice del plugin non puoi fidarti di esso al di fuori di un blocco try/catch. – Jasper