2010-03-13 5 views
5

Dans un VSTO Excel Addin le code:fichier XML d'ouverture situé dans le dossier Addin

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

génère une erreur FileNotFound avec le message (» N'a pas pu trouver le fichier « C: \ Users \ doug \ Documents \ XMLFile1 .xml '. ") Il recherche dans le dossier Mes documents mais le fichier XML se trouve dans le dossier VS Projects pour ce projet. J'ai défini la propriété "Copy to Output Directory" du fichier XML sur "Copy always". Lorsque je modifie le code pour inclure le chemin d'accès complet au fichier XML, le code fonctionne.

En outre, si j'inclure le code ci-dessus dans une console Windows ou un autre type de projet, il s'exécute correctement. Je l'obtiens seulement dans l'Excel Addin. Ceci est vrai pour VSTO 2008/Excel 2003 et VSTO 2010/Excel 2010.

Répondre

13

Lorsque vous utilisez le chemin relatif, le répertoire courant (Environment.CurrentDirectory) est utilisé pour résoudre ce chemin. Dans le cas d'un complément VSTO, il est automatiquement défini dans le dossier des documents utilisateur. Toutefois, pour une application console, cette valeur est définie sur le même dossier que l'exécutable et c'est pourquoi vous rencontrez des comportements différents.

Si votre fichier sera déployé dans le même dossier que votre assembly de complément VSTO, vous pouvez utiliser (AppDomain.CurrentDomain.BaseDirectory) pour créer le chemin d'accès complet au fichier.

Exemple, en C#:

string filename = "XMLFile1.xml"; 

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

XElement.Load(path); 
+0

João, merci beaucoup. Ça marche. –

+1

@ João, c'est génial. Je ne sais pas comment vous avez trouvé cette gemme, car j'ai été Binging toute la journée et je n'ai pas trouvé de réponse à ce problème VSTO. Votre réponse était sur place! Merci beaucoup! –

+0

Toutes les solutions VSTO que j'ai utilisées utilisent '' Environment.CurrentDirectory'' pour obtenir le répertoire de travail, qui a toujours fonctionné jusqu'à hier, je l'ai d'abord pris comme un bogue VS puisqu'il s'agit d'une variable d'environnement relative. J'ai essayé de changer VS travail dir de nombreuses façons ... pas de succès. Merci beaucoup @ João –

1

Vous pouvez également utiliser:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) 
Questions connexes