Stockage d'un fichier dans l'exe et écriture sur HDD à la prem. exec.

Stockage d'un fichier dans l'exe et écriture sur HDD à la prem. exec. - C#/.NET managed - Programmation

Marsh Posté le 18-02-2014 à 18:29:46    

Bonjour,
 
Je développe une application en C# qui réalise une migration de données entre différents soft médicaux et celui de ma boîte qui utilise SQLServer 2008R2 (juste pour info).
Pour chaque DB dont je dois récupérer les données, j'écris un "plug-in" (dll) qui effectue une injection / transformation des données brutes dans une DB intermédiaire.
Ensuite, la partie "commune" de l'application transfère le contenu de la DB intermédiaire vers la DB d'exploitation en effectuant toutes les vérifications et modifications nécessaires.
Actuellement, j'ai plusieurs plugs-in qui permettent de récupérer des DB aussi diverses que : Paradox, HyperFile, FireBird, SqlAnywhere, Oracle, .....
 
Jusqu'à présent, les techniciens qui effectuaient la migration n'avaient qu'à déployer l'application.  Mais avec la dernière DB pour laquelle j'ai du écrire un nouveau "plug-in", j'ai du également écrire une librairie UDF pour FireBird 2.5 (en Delphi).  
 
J'en viens à ma question .....
 
Comment stocker cette dll UDF dans l'exe et l'écrire dans le répertoire UDF de FireBird lors de la première exécution de mon exe ?
Ou de manière plus générale, comment stocker un fichier dans l'exe et être capable de l'écrire sur le disque lors de l'exécution.
 
J'espère avoir été plus ou moins clair ..... :-)
 
Merci d'avance pour votre aide.
 
Yves

Reply

Marsh Posté le 18-02-2014 à 18:29:46   

Reply

Marsh Posté le 18-02-2014 à 22:57:25    

Ce n'est pas facile, car l'exécutable contient souvent un checksum qui est testé au début du programme. Donc, si on rajoute quelque chose il faut aussi changer le checksum. Et si on raccourcit l'exécutable, il faut aussi changer le checksum. L'implantation de ce checksum varie selon les types d'exécutables et selon les compilateurs utilisés.
 
Bref, c'est beaucoup plus compliqué qu'on ne pourrait le penser à priori, et il vaut mieux se rabattre vers les solutions classiques de fichiers compressés et auto-extractibles. Par exemple, 7-zip, Winrar, etc. permettent de faire ça.

Reply

Marsh Posté le 18-02-2014 à 23:15:35    

Stocke le dans les ressources de ton application (vu que t'es en C# c'est pas bien compliqué) et fait une lecture de ces datas vers le disque.
 
Un exemple pour une image:
 
Stream imgStream =  
    Assembly.GetExecutingAssembly().GetManifestResourceStream(
    "YourNamespace.resources.ImageName.bmp" );
pictureBox.Image = new Bitmap(imgStream);
 
 
Pour le checksum; c'est des emmerdes que t'aura pas en c# avec une technique comme ca.

Reply

Marsh Posté le 18-02-2014 à 23:26:03    

Merci à tous les deux.
 
Je pense que je vais essayer avec la solution des ressources.
C'est un peu à ça aussi que je pensais après avoir cherché différentes possibilités.
 
Merci.  Je viendrai faire un petit compte-rendu de la solution retenue.

Reply

Marsh Posté le 18-02-2014 à 23:30:23    

C'est vrai, j'avais oublié cette solution de mettre cela dans une ressource qui accepte le binaire.
 
Il y a aussi Windows Installer et d'autres logiciels d'installation qui sont prévus pour ce genre de déploiement.

Reply

Marsh Posté le 19-02-2014 à 14:10:47    

Code :
  1. Stream dllStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyNameSpace.FireBird_SK.dll" );
  2.     BinaryReader brReader = new BinaryReader(dllStream);
  3.     FileStream fsStream = new FileStream(@"C:\Firebird\Firebird_2_5\UDF\FireBird_SK.dll", FileMode.Create);
  4.                    
  5.     BinaryWriter bwWriter = new BinaryWriter(fsStream);
  6.     byte[] baBytes = new byte[dllStream.Length];
  7.     dllStream.Read(baBytes, 0, baBytes.Length);
  8.     bwWriter.Write(baBytes);
  9.     brReader.Close();
  10.     bwWriter.Close();
  11.     dllStream.Close();


 
Voilà, c'est fait.  J'ai mis un exemple du code utilisé.  Ça marche nickel.
 
Merci pour l'aide !
 
@+

Reply

Marsh Posté le 19-02-2014 à 19:48:52    

:jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed