2010-03-13 12 views
5

In un VSTO Excel Addin il codice:Apertura trova nella cartella di componente aggiuntivo

Dim XMLDoc As XElement = XElement.Load("XMLFile1.xml") 

genera un errore di FileNotFound con il messaggio (" Impossibile trovare il file 'C: \ Users \ Doug \ Documenti \ XMLFile1 .xml '. ") Cerca nella cartella Documenti ma il file XML si trova nella cartella Progetti VS per quel progetto. Ho impostato la proprietà "Copia in Output Directory" del file XML su "Copia sempre". Quando cambio il codice per includere il percorso completo del file XML, il codice funziona.

Inoltre, se si include il codice precedente in una console di Windows o in un altro tipo di progetto, viene eseguito correttamente. Lo sto solo ricevendo nel componente aggiuntivo di Excel. Quanto sopra vale per VSTO 2008/Excel 2003 e VSTO 2010/Excel 2010.

risposta

13

Quando si utilizza il percorso relativo, la directory corrente (Environment.CurrentDirectory) viene utilizzata per risolvere tale percorso. Nel caso di un componente aggiuntivo VSTO, questo viene automaticamente impostato sulla cartella dei documenti dell'utente. Tuttavia, per un'applicazione console tale valore è impostato sulla stessa cartella dell'eseguibile ed è per questo che si verificano comportamenti diversi.

Se il file verrà distribuito nella stessa cartella dell'assembly del componente aggiuntivo VSTO, è possibile utilizzare (AppDomain.CurrentDomain.BaseDirectory) per creare il percorso completo del file.

esempio, in C#:

string filename = "XMLFile1.xml"; 

string path = Path.Combine(
    AppDomain.CurrentDomain.BaseDirectory, 
    filename); 

XElement.Load(path); 
+0

João, grazie mille. Che funzioni. –

+1

@ João, questo è geniale. Non sei sicuro di come hai trovato questa gemma, dato che sono stato Binging tutto il giorno e non sono riuscito a trovare una risposta a questo problema VSTO. La tua risposta era azzeccata! Grazie mille! –

+0

Tutte le soluzioni VSTO ho utilizzato '' Environment.CurrentDirectory'' per ottenere la directory di lavoro, che ha funzionato fino a ieri, l'ho preso come un bug VS dato che è una variabile d'ambiente relativa. Ho provato a cambiare VS lavorando dir in molti modi ... nessun successo. Grazie mille @ João –

1

È inoltre possibile utilizzare:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) 
Problemi correlati