IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

TUTO : Fusionner une ou plusieurs dll dans l'exécutable principal du projet depuis VS


Sujet :

VB.NET

  1. #1
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut TUTO : Fusionner une ou plusieurs dll dans l'exécutable principal du projet depuis VS
    I - Pré-requis :

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

    http://imabox.fr/a3/1402052310BMsGpq17.png


    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)

    http://imabox.fr/a3/1402052311yGI4iC04.png


    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) :

    http://imabox.fr/a3/1402052315f85w8s52.png

    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 :

    http://imabox.fr/a3/1402052323HEzFx815.png

    - 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 :

    http://imabox.fr/a3/1402052326ge7we502.png

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

    http://imabox.fr/a3/1402052327DqWkrI25.png

    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 :

    http://imabox.fr/a3/1402052332zQb4pA47.png

    ....on obtient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    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

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Merci.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Ta méthode DLL_AssemblyResolve n'est pas très générique et ne charge pas les fichiers PDB pourtant très utile en cas de problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string baseResourceName = Assembly.GetExecutingAssembly().GetName().Name + "." + new AssemblyName(args.Name).Name;
        byte[] assemblyData = null;
        byte[] symbolsData = null;
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(baseResourceName + ".dll"))
        {
            if (stream == null)
                return null;
            assemblyData = new Byte[stream.Length];
            stream.Read(assemblyData, 0, assemblyData.Length);
        }
        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(baseResourceName + ".pdb"))
        {
            if (stream != null)
            {
                symbolsData = new Byte[stream.Length];
                stream.Read(symbolsData, 0, symbolsData.Length);
            }
        }
        return Assembly.Load(assemblyData, symbolsData);
    }
    De plus il faut faire attention au code que l'on met dans le Main.

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Merci pour ce complément d'infos Meziantou

    Il est clair que je ne suis pas entré dans le vif du sujet car ce tuto avait pour but d'être simple et clair suite aux demandes répétitives ... et surtout à cette dernière requête dans ce topic : http://www.developpez.net/forums/d14...-l-executable/

    - Concernant le point d'entrée de l'application je l'ai clairement mentionné dans le pré-requis :
    Ce tuto, rédigé dans la catégorie Vbnet, couvre uniquement la configuration du point d'entrée par défaut de l'application.

    J'insiste sur le fait que je parle de projet VbNet car un projet C# par défaut n'a pas le même point d'entrée et en ce sens il ne me semblait pas judicieux d'en parler !

    - Cependant je prends en compte le chargement des fichiers de symboles (.pdb) associés même si dans la majeure partie des cas, peu de personnes en usent.


    A+

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    Merci beaucoup c'est très gentil

Discussions similaires

  1. Utiliser une ou plusieurs dll .net 2.0 dans un site MVC 4.5 ?
    Par Nadinette dans le forum ASP.NET MVC
    Réponses: 2
    Dernier message: 06/12/2013, 16h39
  2. Réponses: 2
    Dernier message: 25/03/2009, 10h51
  3. Réponses: 9
    Dernier message: 08/01/2008, 13h58
  4. [VB]Rajout d'une ou plusieurs frame dans une frame
    Par ept35 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 15/02/2006, 11h41
  5. Réponses: 9
    Dernier message: 29/03/2005, 09h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo