2014-11-21 4 views
7

Si prega di suggerire quale è il migliore per ottenere l'esecuzione dell'assembly posizione.Quale è meglio per ottenere il luogo dell'assembly, GetAssembly(). Posizione o GetExecutingAssembly(). Posizione

Assembly.GetAssembly(typeof(NUnitTestProject.RGUnitTests)).Location 

o

Assembly.GetExecutingAssembly().Location 

Si prega di suggerire che può essere meglio. Posso usare anche GetEntryAssembly()?

+1

Quale assieme si desidera ottenere la posizione? –

+2

Fanno cose diverse, quindi non ce n'è la migliore. – Dirk

+0

Eseguendo l'assembly, ho bisogno di ottenere il percorso 'bin \ Debug' per calcolare qualcosa. –

risposta

18

dipende da ciò che si desidera .. Assembly.GetAssembly restituire il assembly in cui è dichiarato type. Assembly.GetExecutingAssembly restituisce l'assembly su cui è in esecuzione current code. e Assembly.GetEntryAssembly restituiscono process executable, tenere presente che potrebbe non essere il tuo eseguibile. es:

Immagina che il tuo codice sia myexecutable.exe e tu abbia questo scenario.

trdparty.exe -> utilizza Assembly.LoadFile per caricare il tuo eseguibile ed eseguire del codice da riflessione

myexecutable.exe -> utilizza digitare MyClass

ma il trdparty.exe patches il codice per utilizzare la nuova versione di MyClass situato in Patch.dll

Così ora .. se si esegue l'applicazione tutto da solo si ottiene questo risultato

Assembly.GetAssembly(typeof(MyClass)) -> myexecutable.exe 
Assembly.GetExecutingAssembly() -> myexecutable.exe 
Assembly.GetEntryAssembly() -> myexecutable.exe 

ma se avete la scenario precedente si ottiene

Assembly.GetAssembly(typeof(MyClass)) -> Patch.dll 
Assembly.GetExecutingAssembly() -> myexecutable.exe 
Assembly.GetEntryAssembly() -> trdparty.exe 

così come una risposta si dovrebbe usare quello che fornisce il risultato che si desidera .. la risposta può sembrare ovvio che si tratta di Assembly.GetExecutingAssembly() ma a volte non è .. immaginate che si sta tentando di caricare il file application.config associato con l'eseguibile .. poi il percorso sarà molto probabilmente dovrebbe essere Assembly.GetEntryAssembly().Location per ottenere sempre ha percorso del "processo"

come ho detto dipende dallo scenario .. e lo scopo ...

+0

Nel mio caso 'Assembly.GetEntryAssembly()' è nullo.A riposo due viene dato il percorso 'dll' –

+0

la documentazione dice" può restituire null quando un assembly gestito è stato caricato da un'applicazione non gestita " – CaldasGSM

+0

Ma sto usando' C# .net' che è un'applicazione gestita. Non so se 'NUnit' dll è gestita o non gestita. –

1

Sembra piuttosto ovvio: quando si desidera l'assembly in esecuzione, utilizzare GetExecutingAssembly.

A volte non ne hai uno, ad esempio quando è in esecuzione come componente aggiuntivo di Office. Potresti usare invece Assembly.GetAssembly.

Problemi correlati