2011-01-17 15 views
17

Utilizzando C#, creo una DLL in fase di esecuzione e ora desidero aggiungerla come riferimento al mio progetto in fase di esecuzione.Aggiungere la DLL a livello di codice in fase di esecuzione

Ho provato a utilizzare il metodo LoadFrom, ma non funziona.

Come posso fare questo?

+0

qual è la sua necessità di creare/aggiungere dll a run-time? –

+0

Come stai creando una DLL in fase di esecuzione? –

+0

Si desidera aggiungere il riferimento al progetto VS in fase di esecuzione? Non ha senso. – leppie

risposta

4

Utilizzare il metodo Assembly.LoadFile e quindi eseguire il codice al suo interno utilizzando la riflessione.

+0

più velocemente qualche secondo, +1 –

0

È possibile utilizzare il metodo Assembly.LoadFrom per caricare in modo dinamico un assieme in fase di esecuzione.

1

Non è possibile aggiungere dll a un progetto quando il progetto è già in esecuzione. Tuttavia, è possibile caricare la DLL utilizzando Assembly.LoadFrom (nome file). Normalmente tale scenerio viene utilizzato per progetti basati su SOA o plugin. È possibile utilizzare l'interfaccia per specificare la struttura del tipo e caricare la DLL e utilizzarla.

8

LoadFile vs. LoadFrom

Fare attenzione - questi non sono la stessa cosa .

LoadFrom() passa attraverso fusione e può essere reindirizzato a un altro assieme ad un percorso diverso ma con lo stesso identità se si è già caricato contesto LoadFrom. LoadFile() non esegue alcun collegamento tramite Fusion - il caricatore va semplicemente avanti e carica esattamente * quello richiesto dal chiamante. Lo standard non utilizza il caricamento o il contesto LoadFrom . Quindi, LoadFrom() di solito ti dà quello che hai chiesto, ma non necessariamente. LoadFile() è per quelli che vogliono veramente esattamente esattamente ciò che viene richiesto. (* Tuttavia, a partire da in v2, la politica verrà applicata a entrambi LoadFrom() e LoadFile(), quindi LoadFile() non sarà necessariamente esattamente come richiesto. Inoltre, a partire dalla v2, se un assembly con la sua identità è nel GAC, la copia GAC ​​ verrà utilizzata al posto utilizzare ReflectionOnlyLoadFrom() per caricare esattamente quello che vuoi -.. ma, si noti che assembly caricati in questo modo non può essere eseguito )

LoadFile() ha un fermo. Dal momento che non utilizza un contesto vincolante, le sue dipendenze non sono automaticamente trovate nella sua directory. Se non sono disponibili nel contesto di caricamento, è necessario sottoscrivere l'evento AssemblyResolve all'evento per collegare ad essi.

rif Suzanne Cook's .NET CLR Notes

24

primo luogo si dovrebbe caricare la DLL

Assembly assembly = Assembly.LoadFrom("dllPath"); 

quindi potrebbe essere necessario aggiungere il gruppo al dominio applicazione

AppDomain.CurrentDomain.Load(assembly.GetName()); 

Dopo di che è possibile caricare qualsiasi digitare da questo assembly

Type t = assembly.GetType("typeName"); 

Poi utilizzando la riflessione è possibile eseguire i metodi su questo tipo

Nota che potrebbe essere necessario aggiungere il seguito nel file di configurazione.

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="dlls folder"/> 
    </assemblyBinding> 
</runtime> 
+0

grazie a Ghyath Serhal, potresti spiegarlo di più? dove posso cambiare la mia configurazione – Mahsa

+0

Primo Qual è la tua applicazione, è un'applicazione web, un'applicazione Windows, il servizio Windows? –

+0

È un'applicazione Windows. – Mahsa

Problemi correlati