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

C# Discussion :

Création et utilisation de dll en C#


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Création et utilisation de dll en C#
    Bonjour,

    Je souhaiterais créer et utiliser une dll développée en C#.

    J'ai déjà développé des solutions en C# contenant des dll, mais là je souhaiterais juste avoir des dll dans mon projet, pour par exemple les utiliser dans Excel avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare PtrSafe Function test Lib "testLib" Alias "testA" (ByVal a As integer) As integer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    namespace test_namespace
    {
        public static class ClassTest
        {
            public static int test(int a)
            {
                return a * 2;
            }
        }
    }
    Mes problèmes c'est que je ne connais pas tout les détails auxquels il faut être attentif ni comment bien paramétré mon projet: importance du namespace ou de la classe,inscrire au COM, référencer la dll avec regSrv (x32 ou x64), comment distribuer ma dll sur d'autre poste...

    En gros, j'ai une vague idée de comment ça devrait fonctionner... mais Ca ne fonctionne pas... Pouvez-vous m'aider?

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Si je comprends bien, tu veux appeler une dll .NET depuis Excel ?
    Donc en VBA.
    Si c'est bien cela, peut-être auras-tu plus de chances dans le forum VBA.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    L'appel de la dll du coté VBA fonctionne, je le citais en exemple. Mais j'aurais voulu utiliser la dll dans d'autres projets (C#, VB.NET...).

    Je n'arrive pas à créer un projet dll correctement paramétré, et je ne vois pas comment distribuer les dll sur des postes client où la dll sera utilisée.

  4. #4
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Je crois mieux comprendre ton besoin, mais il y a plusieurs façons de faire.

    Peux-tu nous donner un (ou plusieurs) cas concret pour que nos réponses soient plus précises ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Je souhaiterais, par exemple, créer une bibliothèque (dll) de fonctions mathématiques. Ces fonctions devront traiter des paramètres passés en argument et retourner un résultat.

    Je souhaiterais que cette bibliothèque soit dissociée de tout projet exécutable, puisque je l'utiliserais avec des projets différents en C# (ou Excel) ne contenant pas la dll mais lui l'utilisant. (j'ai l'impression de ne plus être très clair...)

    Aujourd'hui, dans une solution complète développée en C# le projet dll communique bien avec les projets exécutables. Mais je souhaiterais pouvoir développer ces différentes parties développées dans des solutions différentes...

    Je crois que ce qu'il me faut, c'est savoir rendre visible ma dll dans "COM>Bibliothèques de types" depuis le gestionnaire de références dans Visual Studio.

    PS: Si cela a de l'importance: je suis sous Windows 8 et Visual Studio 2012

  6. #6
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Quelques réponses :
    • Si ta dll doit être utilisable par des applications non .Net, il vaudra mieux la rendre compatible COM, effectivement. Cette option s'active dans les propriétés d'un projet Visual Studio, dans les information d'assembly, c'est une case à cocher.
    • Pour l'utiliser dans d'autres applications :
      • Applications non .NET : je ne sais pas !
      • Application .NET :
        • Le plus simple :
          - Embarquer la librairie dans l'application en tant que dll .Net.
        • Le plus interopérable (mais bien plus compliqué à mettre en œuvre et pas testé donc sans garantie) :
          - Créer un installeur permettant de déployer la librairie COM (en enregistrant la librairie dans la bibliothèque COM sur le poste cible)
          - Référencer la librairie en tant qu'objet COM dans l'application.

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour Nicolas_Aplus
    Comme dit par Skalp
    il vaudra mieux la rendre compatible COM
    Tu y exposeras les class [ComVisible(true)] visible pour les utilisateurs COM de ta lib...

    Ces class sont par ailleurs visibles pour les users .Net et peuvent etre references normalement ...
    Mieux tu peux y ajouter des class visibles uniquement en .net (class sans l'attribut[ComVisible(true)] )...


    Le grand souci c'est le deploiement .Il faut utiliser l'utilitaire en ligne de commande REGASM :
    - regasm.exe LibNet.dll

    code du projet libnet.dll
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    using System;
    using System.Runtime.InteropServices;
     
    namespace LibNet
    {
        [InterfaceType(ComInterfaceType.InterfaceIsDual)]
        [Guid("9076AFCF-3F7B-445A-8DB1-F3B3D7BB34C3")]  
        //le numero guid doit etre genere par tes soins
        // avec l'outil guidgen de VS(outils->create guid)
        [ComVisible(true)]
        public interface IFunctions 
        {
            double MultiplyNTimes(double number1, double number2, double timesToMultiply);
        }
     
        [Guid("3BCC24D6-3990-4C69-BA7D-E6B825D77FE8")] //Allocate your own GUID
        [ClassInterface(ClassInterfaceType.None)]
        [ProgId("LibNet.MyFunctions")]
        [ComVisible(true)]
        public class MyFunctions : IFunctions
        {
            public MyFunctions()
            {
     
            }
            public double MultiplyNTimes(double number1, double number2, double timesToMultiply)
            {
                double result = number1;
                for (double i = 0; i < timesToMultiply; i++)
                {
                    result = result * number2;
                }
     
                return result;
            }
        }
        //ce  class est visible uniquement en net
        public class NetFunctions 
        {
            public NetFunctions()
            { 
     
            }
     
     
            public double MoyenneFunction(double n1, double n2  )
            {
                return (n1 + n2 ) / 2;
            }
        }
    }
    code cs du winform utilisateur:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using LibNet;
    namespace WinTestLib
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                double x = 5.0;
                double y = 3.0;
                double fois = 2.0;
                MyFunctions fn = new MyFunctions();
     
                textBox1.Text = fn.MultiplyNTimes(x, y, fois).ToString();
                double n1 = 11;
                double n2 = 13;
     
                NetFunctions  netfn = new  NetFunctions ();
                textBox2.Text = netfn.MoyenneFunction(n1, n2).ToString();
            }
        }
    }
    code vba utilisateur (ou vb6 si tu veux)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub CommandButton1_Click()
        Dim x As Double
        Dim y As Double
        Dim fois As Double
        x = 5#
        y = 3#
        fois = 2#
        Set fn = New MyFunctions
        Label1.Caption = fn.MultiplyNTimes(x, y, fois)
    End Sub
    bon code........

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci à tous les deux pour vos indications et exemples. Je n'ai plus qu'à coder...

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Malgrès vos explications et exemples détaillés, je n'arrive toujours pas à mes fins...

    Lorsque je tente d'ajouter la référence à la DLL COM dans un projet C#, j'ai le message d'erreur suivant:

    Une référence à 'LibNet' n'a pas pu être ajoutée.
    La bibliothèque de types ActiveX 'C:\...\LibNet.tlb' a été exportée à partir d'un assembly .NET et ne peut pas être ajoutée en tant que référence.
    Ajoutez une référence à l'assembly .NET à la place.

  10. #10
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    rebonjour

    Il y a comme une mauvaise comprehension de ce qu'est le monde COM et Net..

    Le fichier TonAssembly.tlb c'est pour ajouter une reference avec vb6,vba(monde com)....

    Le fichier TonAssembly.dll c'est pour ajouter une reference à un projet .Net(monde .net)....
    Dans ton projet .net tu ajoute une reference à TonAssembly.dll (et non à TonAssembly.tlb ,c'esttui là est destine à vba,vb6)
    Est ce clair.....

    bon code....

Discussions similaires

  1. Création et utilisation de DLL dans mIRC
    Par ram-0000 dans le forum Réseaux
    Réponses: 0
    Dernier message: 03/04/2013, 14h13
  2. Création et utilisation de dlls dans un programme
    Par Crabe05 dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 02/01/2009, 07h25
  3. Paumé dans la création et l'utilisation de DLLs
    Par pierre.chatelier dans le forum C++/CLI
    Réponses: 22
    Dernier message: 23/10/2007, 15h39
  4. [PB 10.5] Création et utilisation de DLL Powerbuilder
    Par Kalini dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 07/09/2007, 12h21
  5. Réponses: 6
    Dernier message: 07/06/2007, 22h03

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