Extraire 3 fichiers d'un exe [Résolu]

Signaler
Messages postés
22
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 décembre 2009
-
Messages postés
22
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 décembre 2009
-
Bonjour à tous, je vous expose mon problème, j'essaye de créer un setup.exe sans passer par les logiciels de création automatique de setup... Voilà le code que j'ai utilisé pour mettre mon executable avec 2 dll en un seul exe :

        {
            var filesplit = "$$$$";
            var FileExe = new FileStream(Application.StartupPath + "\\DLL\\start.exe", FileMode.Open);
            var Filedll1 = new FileStream(Application.StartupPath + "\\DLL\\22d.dll", FileMode.Open);
            var Filedll2= new FileStream(Application.StartupPath + "\\DLL\\22e.dll", FileMode.Open);
            var br1 = new BinaryReader(FileExe);
            var br2 = new BinaryReader(Filedll1);
            var br3 = new BinaryReader(Filedll2);
            byte[] bin1 = br1.ReadBytes(Convert.ToInt32(FileStub.Length));
            byte[] bin2 = br2.ReadBytes(Convert.ToInt32(File1.Length));
            byte[] bin3 = br3.ReadBytes(Convert.ToInt32(File2.Length));
            Stream bindedfile = new FileStream(Application.StartupPath + "\\SETUP.exe", FileMode.Create);
            var bw = new BinaryWriter(bindedfile);
            bw.Write(bin1 + filesplit);
            bw.Write(bin2 + filesplit);
            bw.Write(bin3);
            bw.Close();
            File1.Close();
            File2.Close();
            FileStub.Close();
            br1.Close();
            br2.Close();
            br3.Close();
        }

Ca me donne un SETUP.exe avec mon executable et les 2 dll dans un seul fichier. Je voulai savoir maintenant comment faire pour le découper et récupérer les 3 fichiers... Je pensai que ce serai facile en utilisant une variable filesplit qui servirai de point de découpage mais la je me casse la tête pour réussir à découper tout ça!
Donc si quelqu un pouvait m aider ça serai sympa ^^

5 réponses

Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
quelque chose comme ça:

Stream setup=new FileStream("setup.exe",FileMode.Open );
BinaryReader br = new BinaryReader(setup);
int len1 = br.ReadInt32();
byte[] dataFile1 = br.ReadBytes(len1);

Cela dit, tu peux aussi faire ton propre Setup en utilisant le visual studio:

Tu te crées ton propre programe d'installation, une application windows ordianire.

Dans ton projet tu ajoutes les fichiers que tu veux embarquer, dans leur propriétés tu changes
"Build Action" de "none" à "Embedded Ressource"

Le fait de possitioner "Embedded Ressource" va obliger le compilateur à integrer ce fichier comme une ressource, il fera donc parti integrante de l'executable final.
(Désolé pour l'anglais mais je n'ai pas de version française du VS.)

Dans ton programme il ne te reste plus qu'à extraire ces fichiers:

dans l'exemple ci dessous, j'ai un projet "MonProjet" auquel j'ai ajouté un fichier "Test.dll"

try

   System.Reflection.Assembly thisExe; 
   thisExe = System.Reflection.Assembly.GetExecutingAssembly(); 
   using (System.IO.Stream input = thisExe.GetManifestResourceStream("MonProjet.Test.dll")) 
   { 
      using (System.IO.FileStream output= System.IO.File.Create("Test.dll")) 
      { 
         byte[] buffer = new byte[32768]; 
         int read; 
         while ((read = input.Read(buffer,0,buffer.Length)) >0) 
         { 
            output.Write(buffer, 0, read); 
         } 
      } 
   }
}
catch
{
   System.IO.File.Delete("Test.dll");
}

C# is amazing, enjoy it!
Messages postés
22
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 décembre 2009

erreur dans le code, voici le bon :

        {
            var filesplit = "$$$$";
            var FileExe = new FileStream(Application.StartupPath + "\\DLL\\start.exe", FileMode.Open);
            var Filedll1 = new FileStream(Application.StartupPath + "\\DLL\\22d.dll", FileMode.Open);
            var Filedll2= new FileStream(Application.StartupPath + "\\DLL\\22e.dll", FileMode.Open);
            var br1 = new BinaryReader(FileExe);
            var br2 = new BinaryReader(Filedll1);
            var br3 = new BinaryReader(Filedll2);
            byte[] bin1 = br1.ReadBytes(Convert.ToInt32(FileExe.Length));
            byte[] bin2 = br2.ReadBytes(Convert.ToInt32(Filedll1.Length));
            byte[] bin3 = br3.ReadBytes(Convert.ToInt32(Filedll2.Length));
            Stream bindedfile = new FileStream(Application.StartupPath + "\\SETUP.exe", FileMode.Create);
            var bw = new BinaryWriter(bindedfile);
            bw.Write(bin1 + filesplit);
            bw.Write(bin2 + filesplit);
            bw.Write(bin3);
            bw.Close();
            File1.Close();
            File2.Close();
            FileStub.Close();
            br1.Close();
            br2.Close();
            br3.Close();
        }
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
28
Bonjour,

plutôt que d'utiliser un séparateur, pourquoi n'inscris-tu pas la mongueur des fichiers en tête ?
cela te permetrais par la suite de lire les fichiers un par un.

genre:
bw.Write(

Convert.ToInt32(FileExe.Length));
bw.Write(bin1);
bw.Write(
Convert.ToInt32(Filedll1.Length));
bw.Write(bin2);
bw.Write(
Convert.ToInt32(Filedll2.Length));
bw.Write(bin3);

C# is amazing, enjoy it!
Messages postés
22
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 décembre 2009

Ah oui je n'y avai pas pensé, mais après pour découper je peux faire comment ?
Messages postés
22
Date d'inscription
mercredi 24 octobre 2007
Statut
Membre
Dernière intervention
1 décembre 2009

Ah excellent je connaissai pas ça ! merci encore pour le coup de main !