2009-11-19 5 views
3

J'ai une bibliothèque de classes qui utilise des fichiers xml trouvés dans son propre répertoire.C# Récupère le chemin de la bibliothèque de classes

Lorsque vous faites référence à cette bibliothèque à partir d'un autre projet, comment puis-je m'assurer que la bibliothèque fonctionne à partir de son propre répertoire?

J'ai essayé Assembly.GetExecutingAssembly(). Location mais cela renvoie toujours le chemin du projet de démarrage.

+0

Votre approche semble correcte. Etes-vous sûr (1) que vous appelez 'GetExecutingAssembly' depuis votre bibliothèque et (2) que vous n'utilisez pas une" copie locale "de la bibliothèque? – Heinzi

+0

(1) Oui (2) La DLL est copiée dans le répertoire du projet de démarrage mais les fichiers xml ne sont pas copiés avec. – djskinner

+0

Eh bien, (2) est la raison. La copie est effectuée par Visual Studio, ainsi l'application * en cours d'exécution n'a aucun moyen de connaître l'emplacement d'origine de ce fichier. – Heinzi

Répondre

14

je sais que c'est un ancien poste, mais dans l'hypothèse où un trébuche d'autre sur elle d'une recherche, la meilleure façon que j'ai trouvé pour ce faire est la suivante:

Public Class Foo 

    Public Shared Function GetMyPath() As String 
      Return Path.GetDirectoryName(GetType(Foo).Assembly.Location) 
    End Function 

End Class 
+0

Salut, qu'est-ce que '' Foo'' ici? – iamserious

+4

@iamserious: Êtes-vous sérieux? – Leif

+4

@Leif, hahaha, je ne me souviens pas avoir fait ce commentaire (bête); très probablement était ivre quand je l'ai fait. – iamserious

0

Je ne pense pas que vous le pouvez, sauf si vous démarrez dans un nouveau domaine d'application, et c'est plus de problèmes que ça en vaut la peine. Copiez simplement les fichiers dont vous avez besoin dans votre propre projet et placez-les à l'endroit prévu par rapport à votre répertoire de travail.

(Vous pouvez également demander au développeur d'origine pourquoi les chemins vers les fichiers nécessaires ne peuvent pas être donnés comme paramètre. Ce serait la façon normale de résoudre ce problème.)

+0

Je suis le développeur d'origine, donc cela peut être une option, mais je ne veux pas avoir à conserver une copie séparée des mêmes fichiers xml pour chaque projet qui utilise la bibliothèque. – djskinner

0

Je suis sûr Il y a quelques fonctions pour obtenir la liste des assemblys chargés depuis l'ExecutingAssembly, bouclez-la pour trouver votre assembly (class lib) et obtenez son emplacement. Désolé pour une réponse vague.

6

Ce qui se passe parce que votre projet de démarrage a deux options de chargement de la bibliothèque

  1. le copier dans son propre dossier (ce qui cause le comportement que vous expérimentez)
  2. le charger du GAC (ce rendrait impossible de charger un XML à partir de son dossier)

Alors vous avez deux options:

  1. Importez les fichiers XML dans le projet et intégrez-les comme "ressources incorporées" dans la bibliothèque de classes et chargez-les en mémoire lors de l'exécution
  2. Importez les fichiers XML dans le projet et modifiez la propriété "Copier dans le répertoire de sortie" du fichier à "vrai".
+0

Point 2 travaillé. Cependant, cela ne semble pas une solution idéale car il pourrait y avoir des conflits. La raison pour laquelle cela ne fonctionnait pas auparavant, c'est que j'avais aussi un répertoire Data dans un autre projet référencé. – djskinner

+0

Utilisez plutôt l'option 1, mais les utilisateurs de l'application ne pourront pas éditer les XML. Je ne peux pas voir d'autres options. –

+0

Pour ajouter d'autres options: Placez les fichiers XML dans un répertoire de données désigné et stockez ce chemin dans votre app.config. Après vous, vous * allez * déployer votre projet sur d'autres PC et l'utiliser en dehors de Visual Studio, n'est-ce pas? – Heinzi

Questions connexes