vendredi 2 mai 2014

Tuto : Fusionner dll(s) dans exe depuis Visual Studio sans passer par ILMerge ...etc...

I - Pré-requis :

Votre projet principal VBNET est obligatoirement paramétré comme suit pour suivre ce tuto :




II - Le projet :

Mon projet principal se nomme "ImaboxUploader".
Les 2 autres projets attenants sont des librairies de classes ou fichiers ".dll et se nomment :
- ImaboxUploader.Components (fichier .dll : ImaboxUploader.Components.dll)
- ImaboxUploader.Core (fichier .dll : ImaboxUploader.Core.dll)




III - Quand je génère mon projet principal :

Lorsque je génère mon projet principal, les autres projets attenants sont aussi générés ce qui créé 3 fichiers dans mon répertoire ...\Bin\Release\ :
(ces 3 fichiers étant nécessaires au bon fonctionnement de mon application lorsqu'elle sera délivrée) :



Cependant je ne veux pas livrer mon projet final avec 2 autres fichiers à côté donc il va me falloir fusionner les assemblys dépendantes (2 fichiers .dll) à mon exécutable principal (1 fichier .exe) afin de distribuer qu'un unique fichier exécutable (imaboxUploader.exe) !


IV - Ajouter les assemblys dépendantes dans les ressources :

- Tout d'abord il faut que votre projet soit fonctionnel en l'état !
- Dans mon exemple les 2 fichiers dll sont bien ajoutées en tant que références :



- Nous allons maintenant ajouter ces 2 fichiers dll dans les ressources de notre projet en vue d'obtenir ceci dans les propriétés de mon projet principal :



...et grâce à l'ajout dans les ressources on obtient donc cela dans l'explorateur de solutions :



IMPORTANT : n'oubliez pas de générer l'ensemble de votre projet afin que les fichiers dlls soient correctement intégrées dans les ressources !


V - Ajouter le code pour charger les assemblys dépendantes en mémoire au démarrage de l'application :

- Dans les propriétés du projet on clique sur le bouton suivant :



....on obtient ceci :

Namespace My
 
    ' Les événements suivants sont disponibles pour MyApplication*:
    ' 
    ' Startup*: déclenché au démarrage de l'application avant la création du formulaire de démarrage.
    ' Shutdown*: déclenché après la fermeture de tous les formulaires de l'application. Cet événement n'est pas déclenché si l'application se termine de façon anormale.
    ' UnhandledException*: déclenché si l'application rencontre une exception non gérée.
    ' StartupNextInstance*: déclenché lors du lancement d'une application à instance unique et si cette application est déjà active. 
    ' NetworkAvailabilityChanged*: déclenché lorsque la connexion réseau est connectée ou déconnectée.
    Friend Class MyApplication
 
    End Class
 
 
End Namespace

- Dans mon cas avec mes 2 dll je remplace le code existant par ceci :

Namespace My
    Friend Class MyApplication
        Private WithEvents DLLDomain As AppDomain = AppDomain.CurrentDomain
 
        Private Function DLL_AssemblyResolve(ByVal sender As Object, ByVal args As System.ResolveEventArgs) As System.Reflection.Assembly Handles DLLDomain.AssemblyResolve
            If args.Name.Contains("ImaboxUploader.Components") Then
                Return System.Reflection.Assembly.Load(My.Resources.ImaboxUploader_Components)
            ElseIf args.Name.Contains("ImaboxUploader.Core") Then
                Return System.Reflection.Assembly.Load(My.Resources.ImaboxUploader_Core)
            Else
                Return Nothing
            End If
        End Function
    End Class
 
 
End Namespace


IMPORTANT :
- N'oubliez pas de générer de nouveau votre projet !
- Si vous voulez tester que cela fonctionne alors assurez-vous de déporter votre fichier executable à l'extérieur de votre répertoire de génération de projet et que vos fichiers dll ne soient pas à côté car il sont maintenant censés être intégrés dans les ressources !


Si vous avez des questions ???



Source d'inspiration du tuto : Source d'inspiration

Aucun commentaire:

Enregistrer un commentaire