2009-07-21 14 views
10

Ho un nome di file, come "Foo.dll", per una libreria che conosco è nella directory bin. Voglio creare un oggetto Assembly per questo. Sto cercando di creare un'istanza di questo oggetto da una classe che non è una pagina, quindi non ho l'oggetto Request per ottenere il percorso. Come ottengo il percorso che mi serve per utilizzare Assembly.Load()?Carica un assembly dal Cestino in ASP.NET

risposta

15

Assembly.Load non deve richiedere un percorso file, ma richiede un AssemblyName. Se si è certi che l'assembly si trova nel percorso di ricerca standard (ad esempio la directory bin), non è necessario conoscere il percorso del disco dell'assembly ... è sufficiente conoscere il nome dell'assembly. Nel caso della vostra assemblea, supponendo che non hanno bisogno di una versione specifica, cultura, ecc, il nome di montaggio dovrebbe essere solo "Foo":

Assembly fooAssembly = Assembly.Load("Foo"); 

Se si ha bisogno di caricare una versione specifica, è avrebbe fatto la seguente:

Assembly fooAssembly = Assembly.Load("Foo, Version=1.1.2, Culture=neutral"); 

In genere, si desidera utilizzare Assembly.Load, piuttosto che Assembly.LoadFrom o Assembly.LoadFile. LoadFrom e LoadFile funzionano al di fuori del processo di fusione standard e possono portare a caricare gli assembly più di una volta, caricati da posizioni non sicure, ecc. Assembly.Load esegue un caricamento "standard", ricercando le posizioni di assemblaggio standard come bin, GAC , ecc. e applica tutti i controlli di sicurezza standard.

+2

in alternativa se hai già un oggetto di un tipo in quell'assieme puoi fare qualcosa del tipo: obj.GetType(). Assembly –

2

Does Assembly.LoadFile (...) funziona?

+0

Er, certo se si conosce il percorso assoluto. Immagino sia questa la parte importante della domanda. –

1

Dalla tua descrizione sembra che questa sia un'applicazione web, quindi, a meno che tu non sia su un thread asincrono generato da una richiesta, dovresti comunque avere accesso allo HttpContext. Da lì è possibile utilizzare Server.MapPath() per il file necessario.

0

Un esempio completo che utilizzo, se aiuta. Risorse è una cartella sotto la radice della libreria DLL (Assemblea)

 public static string ReadAssemblyResourceFile(string resourcefilename) 
     { 
using (var stream = Assembly.Load("GM.B2U.DAL").GetManifestResourceStream("GM.B2U.DAL.Resources." 
    + resourcefilename))   { 
        if (stream == null) throw new MyExceptionDoNotLog($"GM.B2U.DAL.Resources.{resourcefilename} not found in the Assembly GM.B2U.DAL.dll !"); 
        using (var reader = new StreamReader(stream)) 
        { 
         return reader.ReadToEnd(); 
        }   
       } 
     } 

per chiamare la funzione:

[TestMethod()] 
public void ReadAssemblyResourceFileTest() 
{ 
    var res = SetupEngine.ReadAssemblyResourceFile("newdb.sql"); 
    Assert.IsNotNull(res); 
} 

ps. Non dimenticare di contrassegnare "Build Action" come "Embedded Resource" (nella finestra delle proprietà) di ciascun file di risorse.

Problemi correlati