Ressource incorporée lancée via Windows

Résolu
damien77520 Messages postés 3 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 28 juin 2007 - 25 juin 2007 à 13:01
damien77520 Messages postés 3 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 28 juin 2007 - 28 juin 2007 à 14:05
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
25 juin 2007 à 20:04
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
*/
3
damien77520 Messages postés 3 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 28 juin 2007
27 juin 2007 à 13:52
       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.
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
27 juin 2007 à 19:19
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
*/
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
27 juin 2007 à 19:22
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
*/
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
damien77520 Messages postés 3 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 28 juin 2007
28 juin 2007 à 14:05
Donc il existait plusieurs solutions à mon problème. :)

Je suivrais tes conseils pour améliorer mon code.

Encore merci.
0
Rejoignez-nous