234 messaggi dal 08 marzo 2012
Ciao a tutti,

in una web application, deployata su Azure App Service, permetto di eseguire una custom DLL (che implementa una specifica interfaccia) e la mando in esecuzione in un punto specifico della pipeline di elaborazione.
La DLL viene caricata su Azure Blob e, se trovata, viene caricata, dopo averne fatto il download in byte[].

Il tutto funziona molto bene.

Ora il problema è che nella DLL custom vorrei permettere, ad un utente sviluppatore, di far uso di librerie esterne (a piacimento).
Non riesco a capire come, tramite Reflection, si possano caricare in memoria anche tutte le dipendenze per mandare in esecuzione il codice.
Ho provato caricandole nell'AppDomain con un codice simile a quanto segue:

AppDomain.CurrentDomain.Load("Assembly1.dll")
AppDomain.CurrentDomain.Load("Assembly2.dll")
AppDomain.CurrentDomain.Load("Assembly3.dll") 


..ma ottengo sempre errore che non è possibile trovare la DLL referenziata.

Se invece le DLL Assembly1.dll, Assembly2.dll, Assembly3.dll le carico nella cartella BIN dell'App Service tutto funziona.
Ovviamente io voglio permettere a chi scrive la propria custom DLL di definire le dipendenze che desidera e poi caricarle con un'unica procedura su Azure Blob in una specifica cartella (quindi non posso adottare la soluzione di caricarle nella cartella BIN).

E' possible riuscire ad ottenere un risultato del genere?

Grazie,
Modificato da evil80 il 09 ottobre 2019 16:34 -
181 messaggi dal 10 agosto 2019
tanto per provare ,hai tentato di caricare gli assembly come array di bytes invece che con il nome?
234 messaggi dal 08 marzo 2012
surfernet123 ha scritto:

tanto per provare ,hai tentato di caricare gli assembly come array di bytes invece che con il nome?


Si, qui ho messo un semplice esempio ma a tutti gli effetti li carico come byte[].
Aggiungo che se chiamo il metodo "GetAssemblies()" di AppDomain.CurrentDomain di fatto vedo la lista degli assembly corretti ed anche le relative dipendenze ma sembra quasi che "non cerchi li ma altrove".
181 messaggi dal 10 agosto 2019
hai tentato di "dividere" il codice?
AppDomain domain=AppDomain.CurrentDomain;
domain.Load("assembly1")

potresti provare a passare il nome senza ".dll"
Modificato da surfernet123 il 09 ottobre 2019 18:49 -
234 messaggi dal 08 marzo 2012
Io recupero dal Blob di Azure la Dll sotto forma di byte[].
Poi tramite la classe Assembly faccio la load del byte[] stesso.

Non va bene?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
io ti consiglio di caricare gli assembly in un altro AppDomain. Leggi qui, c'è anche del codice di esempio in un repo GitHub.
https://stackoverflow.com/questions/59220/how-do-i-load-an-assembly-and-all-of-its-dependencies-at-runtime-in-c-sharp-for

In questo modo eviti che un plugin malevolo (o semplicemente scritto male) possa destabilizzare la tua applicazione. Tenere il plugin su un altro AppDomain significa però che non potrai passargli le istanze degli oggetti. Leggi qui:
https://stackoverflow.com/questions/4145713/looking-for-a-practical-approach-to-sandboxing-net-plugins


Io recupero dal Blob di Azure la Dll sotto forma di byte[].

Scarica gli assembly in una directory che userai a mo' di cache. E' inutile andare a recuperare il file da Azure ogni volta se non è cambiato.

ciao,
Moreno

Enjoy learning and just keep making
234 messaggi dal 08 marzo 2012
BrightSoul ha scritto:
Ciao,
io ti consiglio di caricare gli assembly in un altro AppDomain. Leggi qui, c'è anche del codice di esempio in un repo GitHub.
https://stackoverflow.com/questions/59220/how-do-i-load-an-assembly-and-all-of-its-dependencies-at-runtime-in-c-sharp-for

Ok lo guarderò senz'altro!

In questo modo eviti che un plugin malevolo (o semplicemente scritto male) possa destabilizzare la tua applicazione. Tenere il plugin su un altro AppDomain significa però che non potrai passargli le istanze degli oggetti. Leggi qui:
https://stackoverflow.com/questions/4145713/looking-for-a-practical-approach-to-sandboxing-net-plugins

Ok.


Io recupero dal Blob di Azure la Dll sotto forma di byte[].

Scarica gli assembly in una directory che userai a mo' di cache. E' inutile andare a recuperare il file da


Ma su un App Service di Azure come posso scaricare i file su una directory? Mi permette di farlo?

Grazie!
11.886 messaggi dal 09 febbraio 2002
Contributi

Mi permette di farlo?

Certo, leggi qua:
https://stackoverflow.com/questions/48947739/azure-app-service-write-to-filesystem-asp-net-web-application

Tieni a mente che i file scritti localmente li perdi al riavvio dell'applicazione ma non è molto importante in questo caso, perché tu quei file (gli assembly, intendo) li puoi riottenere in qualsiasi momento dal Blob Storage.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.