2010-07-02 16 views
14

Ho questo codice per caricare un file di configurazione e leggere tutti i valori e funziona bene quando si esegue l'applicazione, ma naturalmente fallisce su team city perché la directory di base dell'appdomain è dove viene avviato lo script di build (psake). So che posso cambiare la directory nella directory di compilazione prima di eseguire i test, ma ho pensato che fosse meglio fare in modo che il caricamento del file di configurazione funzionasse sempre a prescindere.Un modo migliore per ottenere la directory di base?

XDocument.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cfgFile)); 

C'è un altro modo per ottenere "BaseDirectory" che funzioni davvero tutte le volte? Ho provato la sotto così con gli stessi risultati:

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); 
XDocument.Load(Path.Combine(path, cfgFile)); 

EDIT 1 Il problema è il seguente. La mia directory di base delle soluzioni è "C: \ Project", tutti i file compilati vengono copiati in "C: \ Project \ build". Ora nello script psake accumulo Ho il seguente codice:

task Test -depends PrepareTests { 
    try { 
     #$old = pwd 
     #cd $build_dir 
     &$mspec $mspec_projects --teamcity 
     #cd $old 
    } 
    catch { 
     &echo "Error starting test runner" 
     Exit 1; 
    }  
} 

Come potete vedere ho commentato il cambio di directory che rende la BaseDirectory la posizione del file build/soluzione invece che la cartella di generazione a prescindere da come Provo ad accedervi. Un po 'di confusione se me lo chiedi.

UPDATE Mi piace davvero sapere se è possibile ottenere la directory dell'assembly indipendentemente dalla directory in cui si trova l'applicazione che ha avviato il dominio dell'app. Come?

+2

Cosa vuol dire "directory base"? Dove si trova il file di configurazione in relazione all'assembly? Il secondo esempio dovrebbe funzionare se il file di configurazione si trova nella stessa directory della DLL ... –

+0

Quindi si desidera la directory in cui si trova l'exe? – Craig

+0

@craig - Sì, questo è quello che sto dopo – mhenrixon

risposta

5
string origAssemblyLocation = Assembly.GetExecutingAssembly().CodeBase; 

Per MSDN:

Assembly.CodeBase Proprietà

Ottiene la posizione del gruppo come specificato originariamente

+0

Ho dovuto rimuovere il nome della DLL ma effettivamente mi ha ottenuto la posizione sul disco dell'assembly! – mhenrixon

+2

Attenzione, questo dà una stringa di tipo uri, vale a direFile: ///foo/bar/baz.DLL – knocte

5

La tua domanda non è chiara. Non so davvero se questo è quello che vuoi.

Io di solito uso AppDomain.CurrentDomain.BaseDirectory

Alternative

  • Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
  • Environment.CurrentDirectory
+0

Grazie per il suggerimento ma produce lo stesso risultato. – mhenrixon

1

provare questo:

Module[] modules = Assembly.GetExecutingAssembly().GetModules(); 
    return Path.GetDirectoryName(modules[0].FullyQualifiedName); 
+0

Grazie, non l'ho provato prima. Cerca comunque di trovare il file xml nella dir della soluzione invece della dir di generazione. – mhenrixon

+0

è possibile registrare il file di assembly nella directory di costruzione dopo averli copiati. – Arseny

1

hai provato ad ottenere il NomeFile del processo corrente 'MainModule?

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 

Oppure GetEntryAssembly()?

System.Reflection.Assembly.GetEntryAssembly().Location 
8

Sembra quindi che si stia tentando di ottenere il file di configurazione per un assieme. Il seguente dovrebbe svolgere questo compito accedendo alla 'posizione' di proprietà del gruppo e di utilizzarlo per recuperare il percorso di configurazione:

static string GetConfigFileByType(Type type) 
{ 
    Configuration config = 
     ConfigurationManager.OpenExeConfiguration(type.Assembly.Location); 

    if (config.HasFile) 
     return config.FilePath; 
    throw new FileNotFoundException(); 
} 
1

mi piace fare le mie lezioni configurabile - ad esempio ottengono il nome della cartella come parametro nel loro costruttore. Ciò rende possibile testare con diversi file di configurazione.

Nel codice di prova si usa:

TestContext.TestDeploymentDir 

Questa è la cartella TestRun, in cui tutti i gruppi per una corsa di prova vengono copiati in, insieme con gli articoli di implementazione di prova. Noi "distribuiamo" i nostri file di configurazione del test unitario nella cartella del test run, che può essere specificato nella finestra di dialogo testrunconfig in visual studio.

Per il nostro codice di produzione passiamo

Assembly.GetExecutingAssembly().Location 

al costruttore, che lavora per noi.

+0

"Se il file caricato è stato copiato dall'ombra, il percorso è quello del file dopo essere stato copiato dall'ombra."/La proprietà Location non darà all'OP ciò che sta cercando in questo caso. – hemp

+0

Come nota a margine, questo è meglio se si prevede di utilizzare il bridge desktop – Alexander

1

come circa:

Application.StartupPath; 
16

differenti modi per ottenere la directory di base

  1. AppDomain.CurrentDomain.BaseDirectory

  2. Directory.GetCurrentDirectory() // non garantito di lavorare su applicazioni mobile

  3. Environment.CurrentDirectory // questa chiama Directory.GetCurrentDirectory()

  4. this.GetType().Assembly.Location// Assembly.location

  5. Application.StartupPath // per applicazioni Windows Forms

  6. Application.ExecutablePath // stessa Application.StartupPath

Problemi correlati