View Full Version : [c#] assembly......come si caricano?
vittorio130881
22-09-2009, 14:31
ciao a tutti
sto studiando gli assembly di c#, la loro creazione, il loro uso etc...
mi sono venuti dei dubbi però:
in quando si fa riferimento ad un assembly in un altro assembly (quello contenente il main per esempio) non si carica in memoria l'assembly. ma esso viene caricato quando si fa uso di una sua classe o metodo per esempio.
ma allora assembly.load a che server? per caso per caricare una dll in un appdomain per esempio?
e se si trattasse di un exe, l'assembly da caricare, quale è il comando giusto? sempre load? o devo fare un un trhead nuovo ad esempio??
scusate la confusione, accetto ogni consiglio anche quello che parte dalla teoria degli assembly! ciao
vittorio130881
22-09-2009, 19:26
UP
vittorio130881
23-09-2009, 17:28
up
giangian2
24-09-2009, 07:23
Ciao
in quando si fa riferimento ad un assembly in un altro assembly (quello contenente il main per esempio) non si carica in memoria l'assembly. ma esso viene caricato quando si fa uso di una sua classe o metodo per esempio.
questo è vero in parte, in quanto l'assembly viene caricato in memoria ma è il codice che viene compilato in codice macchina quando viene eseguita una funzione (compilatore JIT (http://it.wikipedia.org/wiki/Compilatore_just-in-time)).
ma allora assembly.load a che server? per caso per caricare una dll in un appdomain per esempio?
e se si trattasse di un exe, l'assembly da caricare, quale è il comando giusto? sempre load? o devo fare un un trhead nuovo ad esempio??
Il metodo Assembly.Load (http://msdn.microsoft.com/it-it/library/system.reflection.assembly.aspx)
serve per caricare in memoria un assembly (che sia una dll o un exe), successivamente si possono esplorare i metadati e le parti costitutive di assembly, scoprire i tipi contenuti negli assembly e creare istanze di tali tipi.
I thread servono solamente per eseguire del codice senza bloccare l'applicazione principale, il caricamento di un assembly non è un operazione cosi` pesante.
ciao
Marco
vittorio130881
24-09-2009, 08:47
rispondendo alla tua affermazione:
questo è vero in parte, in quanto l'assembly viene caricato in memoria ma è il codice che viene compilato in codice macchina quando viene eseguita una funzione (compilatore JIT)
ma allora il vero caricamento in tempo reale, ovvero che proprio il codice della dll venga caricato in memoria (ancor prima di essere compilato jit)
col c# non si può fare?
devo per forza dare il riferimento alla dll e quindi portarla in memoria.....
ho capito bene???
giangian2
24-09-2009, 10:23
ma allora il vero caricamento in tempo reale, ovvero che proprio il codice della dll venga caricato in memoria (ancor prima di essere compilato jit)
col c# non si può fare?
devo per forza dare il riferimento alla dll e quindi portarla in memoria.....
ho capito bene???
che io sappia no o almeno non sono riuscito a trovare un modo per farlo, è uno dei problemi piu` grossi che ho riscontrato passando da c++ a c#.
Con C++ se qualcosa non era allineato (tra exe e dll) all'avvio dell'applicazione veniva emesso il messaggio di errore "Entry point not found....", cosi` si poteva risolvere il problema immediatamente. Mentre con C# ti rendi conto di qualche disallineamento solo quando il codice viene effettivamente eseguito.
Ma a te interessa per trovare eventuali disallineamenti?
tomminno
24-09-2009, 10:45
rispondendo alla tua affermazione:
ma allora il vero caricamento in tempo reale, ovvero che proprio il codice della dll venga caricato in memoria (ancor prima di essere compilato jit)
col c# non si può fare?
devo per forza dare il riferimento alla dll e quindi portarla in memoria.....
ho capito bene???
Il problema è che questi dettagli sono gestiti completamente dal runtime del .NET che fa più o meno quello che gli pare.
Quando e come il runtime caricherà il tuo assembly non è sotto il tuo controllo, te lo istruisci che dovrà caricare quel determinato assembly ma il momento in cui verrà effettivamente allocato in memoria rientra tra le politiche di gestione interne del runtime.
Esattamente come quando fai il Dispose di una SqlConnection non è che la connessione vero il database viene effettivamente chiusa, la connessione rimane aperta e riusata quando necessario, non saprei proprio come istruire .NET per forzargli la chiusura del socket verso il db.
Ma ti serve davvero partire da un argomento così complicato senza esserti fatto le ossa con la normale programmazione C#?
vittorio130881
24-09-2009, 10:57
allora rispondo a entrambi
le ossa me le sono fatte studiando il libro della hoepli c# guida alla programmazione.
arrivato al capitolo degli assembly ho trovato un po di difficoltà, poichè non seguendo corsi se le domande non le faccio a voi a chi potrei rivolgermi??? :)
grazie mille per le risposte!!!
tomminno
24-09-2009, 12:13
allora rispondo a entrambi
le ossa me le sono fatte studiando il libro della hoepli c# guida alla programmazione.
arrivato al capitolo degli assembly ho trovato un po di difficoltà, poichè non seguendo corsi se le domande non le faccio a voi a chi potrei rivolgermi??? :)
grazie mille per le risposte!!!
Farsi le ossa significa provare a mettere in pratica quello che hai letto nei capitoli precedenti :)
Con l'Assembly.load istruisci il runtime che dovrà caricare quell'assembly, quando e come lo farà è compito suo deciderlo.
Senza contare che l'istruzione Assembly.Load forse la scriverai una volta o 2 (noi i.e. l'abbiamo usata un paio di settimane fa per qualcosa di molto particolare), ma che potresti anche non scriverla mai in tutta la vita.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.