Ressource incorporée lancée via Windows

[Résolu]
Signaler
Messages postés
3
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
28 juin 2007
-
Messages postés
3
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
28 juin 2007
-
Bonjour,

Je vous expose mon problème:
-J'ai une documentation pdf qui est en ressource incorporée dans l'executable et je souhaite l'ouvrir via windows.
-J'ai pensé à deux choses:

1)

 System.Reflection.Assembly.LoadFile("./Resources.MaDocumentation.pdf");

2)

System.Diagnostics.Process process_doc = new System.Diagnostics.Process();
process_doc.Start("AcroRd32", a.GetManifestResourceStream("Resources.MaDocumentation.pdf"));

Sans Succès.

Il semblerait que la méthode que j'utilise est mauvaise dans ce cas là.
Si quelqu'un aurait une idée ou une suggestion concernant ce problème je lui en serait reconnaissant.

5 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

Pour Assembly.LoadFile, ça ne risque pas de fonctionner, ce n'est pas du tout son but.
Pour l'autre solution ça ne peut pas fonctionner tel quel, bien qu'elle comporte les 2 éléments qui vont te servir.
Je dirais que là ta seule solution est d'écrire le fichier sur le disque à partir du flux que tu récupères via GetManifestResourceStream, puis de passer son chemin d'accès en paramètre à Acrobat.

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
3
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
28 juin 2007

       Salut,

            Donc l'idée était bonne il m'a fallut copier le fichier sur le disque depuis l'exec. et ensuite le lancer de manière normale.
            A la différence que lorsque j'y accédais avec GetManifestResourceStream je rencontrais des erreurs lorsque je l'exploitais avec StreamWriter.
             Je suis donc passé parWindowsApplication1.Properties.Resources.
            Donc voila le code qui fonctionne, très utile pour que la doc suive toujours l'executable.

            StreamWriter fw;
 
            string path = @"C:/MaDocumentation.pdf";
                                  
            using(FileStream fs2= File.Create(path))
            {
                FileStream fs2 = File.Create(path);
               fw = new StreamWriter(fs2);
               fw.BaseStream.Write(WindowsApplication1.Properties.Resources.MaDocumentation, 0, WindowsApplication1.Properties.Resources.MaDocumentation.Length);
               fw.Close();
               fs2.Close();          
            }

            System.Diagnostics.Process process_doc = new System.Diagnostics.Process();
            process_doc.StartInfo.FileName = "C:/MaDocumentation.pdf";
            process_doc.Start();

Merci pour ton aide.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
J'aurais quelques remarques supplémentaires :
- ne part pas du principe que le poste sur lequel sera executée ton application possedera un lecteur C
- ne part pas du principe que le compte executant ton appication auras accès en écriture à la racine du lecteur système, ce n'est pas forcément le cas, et je dirais même que j'espère que ça le sera de moins en moins = > utilises, par exemple, le répertoire temporaire de l'utilisateur via Path.GetTempPath (voir aussi ici pour les autres répertoires "spéciaux")
- GetManifestResourceStream nécessite le nom complet de la ressource (je n'ai pas vu l'erreur dans le premier post), qui inclu l'espace de nom par défaut du projet : dans ton cas ça devrait plus ressembler à ceci : "WindowsApplication1.Resources.MaDocumentation.pdf" (l'ami Reflector se fera un plaisir de t'aider à vérifier ce genre d'infos ;-)) (mais ça ne servira à rien si tu ne l'as pas inclu via "Ressource incorporée" dans l'explorateur de solution).
- pourquoi initialiser un StreamWriter sur ton FileStream pour n'utiliser que la méthodes de son flux sous jacent (ton FileStream) exposé par sa propriété BaseStream ? Utilises directement le FileStream :

string path = Path.Combine(Path.GetTempPath(), "MaDocumentation.pdf");



using (FileStream fs = new FileStream(path, FileMode.Create))
{
    fs.Write(WindowsApplication1.Properties.Resources.MaDocumentation, 0, WindowsApplication1.Properties.Resources.MaDocumentation.Length);
}



System.Diagnostics.Process process_doc = Process.Start(path);





/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Ha oui sinon il existe aussi la méthode File.WriteAllBytes, dont j'oublie toujours l'existence :

string path = Path.Combine(Path.GetTempPath(), "MaDocumentation.pdf");



File.WriteAllBytes(path, WindowsApplication1.Properties.Resources.MaDocumentation);



System.Diagnostics.Process process_doc = Process.Start(path);







/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
3
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
28 juin 2007

Donc il existait plusieurs solutions à mon problème. :)

Je suivrais tes conseils pour améliorer mon code.

Encore merci.