J'ais fais une petit applis VB.NET, rien de plus simple, on pourrait même dire un cas d'école, une applis VB.NET avec un chtit formulaire, un bouton pour valider. Récupération des données sur un dataset typé, qui servait de source à l'état.
Je vous passe les heures de galère pour bien caler la présentation de mon état, et j'arrive au moment fatidique : le déploiement !!!
Quand on a VS.NET 2003, le déploiement n'est, en principe, qu'une simple formalité. Surtout sur des projets aussi simples. On crée un projet setup, on colle le projet VB.NET en output, VS.NET détecte les dépendances, génère le setup et c'est fini... en théorie oui, mais il s'avère qu'avec des états crystal reports c'est pas aussi simple ;p
Mon premier setup :
Je crée un projet setup, je colle le projet VB.NET en output, VS.NET détecte les dépendances à mes assemblies, m'ajoute un module de fusion "Crystal_managed2003.msm", je génère le setup.
Je fais un premier test sur une machinne équipé de VS.NET, aucuns problèmes.
Je télécharge boostraper pour ajouter MDAC et le .NET framewok au setup et me voilà parti pour un nouveau test sur une machine "quelconque"...
Mon deuxième setup :
Donc avec ce deuxième setup je teste sur une machine sans VS.NET installé, sans rien installé à part win 2000 et le sp.
Et là ... c'est le drame !!!
Même pas ma form qui s'affiche, direct je prends
---------------------------
etats.exe - Common Language Runtime Debugging Services
---------------------------
Application has generated an exception that could not be handled.
Process id=0x574 (1396), Thread id=0x1dc (476).
Click OK to terminate the application.
Click CANCEL to debug the application.
---------------------------
OK Annuler
---------------------------
avec un message comme ça, le debug c'est pas gagné :-/
Alors, ce que je fais, je regarde les assemblies qui se chargent au démarrage de mon applis, et là je m'aperçois qu'il semble qu'il me manque : crdb_adoplus.dll
Qui devrait se trouver dans : C:\Program Files\Fichiers communs\Crystal Decisions\1.0\Bin\
Je cherche un peu partout, msdn, le site http://www.businessobjects.com/ et mon amis google, je m'aperçois que cette dll peut s'installer à l'aide du module de fusion "Crystal_Database_Access2003.msm"
Donc je mets le module de fusion, je build et je reteste.
Troisième setup
Toujours le même problème ... je me décide donc à mettre une msgbox au tout début de mon initialize componment pour voir si l'applis se lançait ou plantait avant...
L'applis se lançait bien, et en cherchant un peu je m'aperçois que dans l'initialisation des composants, dans le code généré par VS.NET, l'initialisation de mon état levait une exception...
Je fais un msgbox sur l'exeption levé et je tombe sur :
---------------------------
etats
---------------------------
Cannot find KeycodeV2.dll, or invalid keycode. , CrystalDecisions.CrystalReports.Engine, at .F(String _ , EngineExceptionErrorID _
) at .B(String __, Int32 __) at CrystalDecisions.CrystalReports.Engine.ReportDocument.;() at CrystalDecisions.CrystalReports.Engine.ReportDocument.InternalInit() at CrystalDecisions.CrystalReports.Engine.ReportDocument..ctor() at CrystalDecisions.CrystalReports.Engine.ReportClass..ctor() at etats.Volume..ctor() at etats.SynReport.InitializeComponent()
---------------------------
OK
---------------------------
Petite recherche sur google, et là je tombe carrément sur le c.. !!!
En fait il faut aussi inclure "Crystal_regwiz2003.msm" (si vous avez bien compté ça fait 2 dépendances que VS.NET n'a pas détecté). Mais c'est pas tout, il faut enregistrer Crystal Report, ou comment perde une heure pour attendre un numéro de série qui arrive par mail, et qui semble être le même pour tout les utilisateurs de VS.NET.
Et c'est pas tout, ensuite il faut rentrer le numéro de série dans le champ ID, dans les propriété du modume de fusion, en développant "Merge Module property" (trés intuitif non !!!!).
Si vous ne faites pas ça, VS.NET build le setup sans même un warning, pas un méssage que dalle, et à l'execution de l'applis Crystal Report vous balance direct une exception !!!
Bref une journée de perdue, pas mal sur les nerfs, mais heureusement il fait un temps de folie et une petite heure à faire bronzette à la plage ça vous ressource un homme ;)))