3 votes

Je ne peux pas lire mon fichier XML intégré dans mon deuxième projet C#.

J'ai une solution Visual Studio avec deux projets à l'intérieur.

Le premier projet est un service Windows, et ce projet contient un fichier XML dans un dossier (appelé Configurations). Ce fichier XML s'appelle Databases.xml. J'ai changé l'action de construction de Databases.xml de contenu à ressource intégrée, et maintenant je veux accéder à ce fichier XML à partir de mon autre projet dans ma solution, qui est une application WPF.

J'ai donc ajouté une référence à mon projet de service Windows dans mon projet WPF, et je voudrais maintenant accéder à mon fichier XML à partir de mon projet WPF.

Le problème est que lorsque j'essaie d'accéder à la ressource intégrée, je ne parviens pas à savoir quel type de ressource utiliser et quel doit être le chemin/espace de nom de mon assemblage et du fichier XML. Lorsque j'utilise la méthode

string[] names = this.GetType().Assembly.GetManifestResourceNames();

mon tableau de noms est rempli avec quelques ressources de mon projet WPF. Ce que je veux, c'est accéder aux ResourceNames et bien sûr à mon fichier Databases.xml à partir de mon projet Windows Service.

Veuillez m'aider car ce problème me rend fou.

Si vous avez besoin d'informations supplémentaires, n'hésitez pas à me le faire savoir.

Ma solution Mise à jour 26-07-2013

J'ai découvert que le vrai problème est survenu lorsque je n'ai pas pu utiliser l'espace de nom de mon premier projet de Service Windows comme type pour mon assemblage. Mon Service Windows consiste en une classe de service (avec la méthode OnStart() et OnStop() à l'intérieur), et afin d'utiliser cette classe comme type de mon espace de nom, j'ai dû ajouter une autre référence à mon projet WPF. J'avais besoin d'ajouter une référence à l'espace de nom System.ServiceProcess, afin d'utiliser ma classe de service Windows comme type pour mon assembly dans mon projet WPF.

Afin d'accéder à mon fichier Databases.xml, j'ai trouvé cette solution. N'oubliez pas d'insérer le nom de votre propre projet et le nom de votre classe au lieu de mes caractères de substitution (<Nom du projet de service Windows> etc).

//Remember to add a reference to System.ServiceProcess in order to be able to use your WIndows Service Project as an assembly type.
using (Stream stream = typeof(<Windows Service Project Name>.<Windows Service Class Name>).Assembly.GetManifestResourceStream("<Windows Service Project Name>.<Folder Name>.Databases.xml"))
{
    //Load XML File here, for instance with XmlDocument Class
    XmlDocument doc = new XmlDocument();
    doc.Load(stream);
}

Mon vrai problème était donc que je n'avais pas inclus la référence System.ServiceProcess dans mon deuxième projet.

2voto

Sriram Sakthivel Points 33463

Vous devez vous référer à Windows Service project Assembly pour que ça marche

Le problème avec votre code est This.GetType().Assesmbly donne le courant Assembly Dans votre cas WPF Assembly et il est évident que vous n'y trouverez pas ce dont vous avez besoin.

Essayez ceci

Assembly windowsServiceAssembly = typeof(SomeTypeFromThatAssembly).Assembly;
string[] names = windowsServiceAssembly.GetManifestResourceNames();

J'espère que cela vous aidera.

0voto

Behzad KH Points 1

Si votre classe est une classe statique, utilisez cette méthode :

internal static string GetFromResources(string resourceName)
    {
        var asm = Assembly.GetExecutingAssembly();

        var resource = asm.GetManifestResourceNames().First(res => res.EndsWith(resourceName, StringComparison.OrdinalIgnoreCase));

        using (var stream = asm.GetManifestResourceStream(resource))
        {
            if (stream == null) return string.Empty;

            using (var reader = new StreamReader(stream))
            {
                return reader.ReadToEnd();
            }
        }
    }

Par exemple, si le nom de votre fichier de ressources intégré dans ce projet est 'MyFile.txt', utilisez cette méthode statique et le même code :

var myFileData = GetFromResources("MyFile.txt");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X