2010-02-10 20 views

risposta

4

Un vantaggio è per supportare un'architettura di plugin.

Supponiamo ad esempio che si desideri scrivere un servizio che esegue diversi tipi di attività su base pianificata. Quello che stanno facendo quei compiti, non è in realtà rilevante per il tuo servizio principale che è lì solo per dargli il calcio d'inizio al momento giusto. Inoltre, è più che probabile che si desideri aggiungere supporto per eseguire altri tipi di attività in futuro (oppure un altro sviluppatore potrebbe volerlo). In questo scenario, implementando un approccio plugin, è possibile inserire più dll (compatibili per interfaccia) che possono essere codificate indipendentemente dal servizio principale. Pertanto, l'aggiunta di supporto per una nuova attività non richiede una nuova build/distribuzione dell'intero servizio. Se è necessario modificare una determinata attività, è sufficiente ridistribuire la dll e quindi recuperarla automaticamente.

Richiede inoltre che altri sviluppatori non siano interessati al servizio in sé, ma devono solo sapere quale interfaccia implementare in modo che possa essere raccolta.

+0

E se il sistema è un sistema di tipo di architettura non plug-in. Quali altri vantaggi sarebbero? – James

+0

Le uniche volte che ho fatto è all'interno di un'architettura plugin tbh. Non riesco a pensare ad un altro motivo per cui altrimenti lo considererei diversamente. Forse un qualche tipo di scopo di sicurezza - ad esempio, caricare solo DLL che forniscono la funzionalità a cui un determinato utente può accedere. Ma non sono nemmeno sicuro che sarebbe un approccio valido per prendere il controllo del controllo di altri modi nel codice! – AdaTheDev

+0

E per quanto riguarda le prestazioni? È importante che tu abbia una DLL caricata quando in realtà la utilizzi solo raramente? – James

1

Caricamento dinamico di oggetti condivisi è il meccanismo per consentire ai plugin ad hoc di eseguire applicazioni. Senza plugin un'applicazione modulare dovrebbe essere assemblata in link-time o in fase di compilazione (guarda il codice di nginx).

1

La tua domanda riguarda C# /. NET, quindi in questo mondo il caricamento dinamico di DLL richiede competenze di programmazione avanzate. Questo potrebbe compensare tutti i potenziali benefici del caricamento dinamico della DLL. Dovresti semplicemente scrivere un codice molto "di basso livello".

In C++/Win32 Spesso devo caricare una DLL dinamicamente quando questa DLL ha qualche nuova funzione API che non è disponibile su sistemi operativi precedenti. In questo caso ho bisogno di garantire la disponibilità di questa API in fase di runtime. Non posso semplicemente collegarmi a questa DLL perché causerà errori di caricamento delle applicazioni sui sistemi operativi legacy.

Come accennato, si potrebbero anche avere alcuni vantaggi in un ambiente basato su plugin. In questo caso avresti un maggiore controllo sulle tue risorse se caricassi le DLL in modo dinamico. Essenzialmente COM è un buon esempio di gestione dinamica delle DLL.

2

Utilizziamo questa architettura per le nostre applicazioni di elaborazione per gestire le differenze richieste dai diversi clienti. Ogni DLL ha una struttura simile e implementa la stessa interfaccia e metodo di input "Process()". Abbiamo un file XML che definisce quale classe caricare in base al cliente e se ci sono più metodi oltre al processo che deve essere chiamato. Le prestazioni non dovrebbero essere un problema fino a quando il conteggio delle transazioni diventa molto alto.

1

Se si caricano solo le DLL necessarie, il tempo di avvio dell'applicazione dovrebbe essere più veloce.

0

Un altro motivo per caricare le DLL dinamicamente è per la robustezza.

È possibile caricare una DLL in ciò che è noto come AppDomain. Un Appdomain è fondamentalmente un contenitore di sandbox in cui è possibile inserire le cose (o parti di DLL o interi EXE) da eseguire in isolamento, ma all'interno dell'applicazione.

A meno che non si chiami in un tipo contenuto in un AppDomain, non è possibile interagire con l'applicazione.

Quindi, se si dispone di una DLL di terze parti dubbia o di una DLL per cui non si dispone del codice sorgente, è possibile caricarla in un AppDomain per tenerlo isolato dal flusso dell'applicazione principale.

Il risultato finale è che se la DLL di terze parti getta un traballante, solo l'appdomain, e non è interessata l'intera applicazione.

Problemi correlati