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 :

Utilisation d'une instance C# en VB6


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut Utilisation d'une instance C# en VB6
    Bonjour a tous,

    Ma question est un peu complexe car je ne trouve pas de solutions sur le net.

    Voilà mon problème :
    J'ai un programme C# avec une classe toute simple (quelques attributs string avec accesseurs).
    En référence de ce programme j'ai une DLL codée en VB6.

    J'aimerais faire passer une instance de ma classe à ma dll VB6 mais j'ai une erreur de cast.

    mon instance en C# est déclarée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object task = new C_Tache { NomTache = "Test", NomPerso = "Test"    };
    côté VB6, la fonction devant récupérer l'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Public Sub Set_Tache(ByRef task As Object)
        Set ObjTask = task
        Call testPassageTache
    End Sub
    J'ai utilisé le type Object pour être sur que ça marche mais ça ne marche pas.

    On peux noter par contre que dans le sene inverse ça fonctionne et sans se préoccuper du type, VS parse l'objet correctement, par contre l'autocompletion est désactivée mais on accède bien aux méthodes et attributs de l'instance récupérer, donc je pensais que dans le sens inverse ça pourrait marcher.

    Si quelqu'un à une piste, merci

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour alexxxx69....
    Il y a là comme une simplification d'un probleme assez complexe....
    Qel est le besoin exactement?
    C.à.d qui est client(consommateur) et qui est serveur(producteur)?

    1er cas est assez simple ton inversement)
    -Appli Net CSharp client
    -Dll vb6 serveur(les dll activexX de VB6 ne sont pas des dll win32 et ne peuveuvent etre appele via/Pinvoke).
    Ce sont des objets COM et et une fois compile elles peuvent etre reference directement dans l'appli CSharp client (ajouter Reference..... mais attention via le panneau COM ou elles exposent un fichier d'inscription au registre MyDllVB6.tlb).
    Nota Bene : les class crees dans un projet ActiveX ne possedent de constructeur avec parametre(limitation inherente aux class VB6)......


    2eme cas cas à probleme)
    -Appli Net CSharp client
    -Dll vb6 serveur.
    -passage d'une instance d'objet Net C_Task au serveur ActiveX VB6.
    Ce passage de parametre necessite un class Net C_Task Exposable à Com bien particulier.....dont l'exemple suit:

    fichier Projet Library LibNetToCom.cs (du class exposable à l'ActiveX dll COM voir ci-apres ):
    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
    53
    54
    55
    56
     
    using System;
    using System.Reflection;
    using System.Runtime.InteropServices;
     
    namespace LibNetToCom
    {
        [ComVisible(true)]
        public interface IC_Task
        {
            String NomPerso { get; set; }
            String NomTache { get; set; }
            double Payment { get; set; }
            void ComputePayment();
     
        }
        [ComVisible(true)]
        [ClassInterface(ClassInterfaceType.AutoDual)]
        public class C_Task : IC_Task
        {
            public C_Task()
            { 
     
            }
            private String nomPerso;
            public String NomPerso
            {
                get { return nomPerso; }
                set { nomPerso = value; }
            }
     
            private String nomTache;
            public String NomTache
            {
                get { return nomTache; }
                set { nomTache = value; }
            }
            private double payement;
            public double Payment
            {
                get { return payement; }
                set { payement = value; }
            }
     
            public void ComputePayment()
            {
                double rate=0.25;
                Payment =  rate / (1 -
                            Math.Pow((1 + rate),  2));
     
            }
     
         }
     
     
    }
    -cocher Inscrire COM
    -signer l'assembly.
    -generer......
    fichier Projet Library Dll ActiveX MyDLLVBNetToCOM.vb (serveur ActiveX 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
    53
    54
    55
    56
    57
     
    '------le module de  class s'appelle CTaskVB(nom de class)---------
    'local variable(s) to hold property value(s)
    Private mvarNomPerso As String 'local copy
    Private mvarNomTache As String 'local copy
    ' ---------Ajouter une  Reference au projet .Net  LibNetToCom-------------
    Private mvarTask As C_Task   'local copy
     
    '-----------Properties------------------------
    Public Property Let NomPerso(ByVal vData As String)
    'used when assigning a value to the property, on the left side of an assignment.
    'Syntax: X.NomPerso = 5
        mvarNomPerso = vData
    End Property
     
     
    Public Property Get NomPerso() As String
    'used when retrieving value of a property, on the right side of an assignment.
        NomPerso = mvarNomPerso
    End Property
    Public Property Let NomTache(ByVal vData As String)
    'used when assigning a value to the property, on the left side of an assignment.
        mvarNomTache = vData
    End Property
     
     
    Public Property Get NomTache() As String
    'used when retrieving value of a property, on the right side of an assignment.
     
        NomTache = mvarNomTache
    End Property
     
    ' ---------PROPERTY REFERENCE au Class NET------------------------
    Public Property Let Task(ByVal vData As C_Task)
    'used when assigning a value to the property, on the left side of an assignment.
     
      Set mvarTask = vData
    End Property
     
     
    Public Property Get Task() As C_Task
    'used when retrieving value of a property, on the right side of an assignment.
     
      Set Task = mvarTask
    End Property
    '----------------------------------------
    ' ---------SUB DE TEST-------------------
    '----------------------------------------
    Public Sub GetTache()
     
        'Affecte à CTaskVB
        Me.NomPerso = Me.Task.NomPerso
        Me.NomTache = Me.Task.NomTache
        'Modifie et renvoie les valeurs de CtaskVB
        Set Me.Task.NomPerso = "from vb6..." & Me.NomPerso
        Set Me.Task.NomTache = "from vb6..." & Me.NomTache
    End Sub
    -dans Proprietes du Projet sous Project Name mettre: MyDLLVBNetToCOM
    -ajouter reference au projet LibNetToCom (disponible dans panneau VB)..
    -generer..............

    fichier Appli Net WinCSharVB6NetToCom.cs :
    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
     
    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;
    //ajouter une ref (panneau Com)
    using MyDLLVBNetToCOM;
     
    //ajouter une ref (panneau projet)
    using LibNetToCom;
     
    namespace WinCSharVB6NetToCom
    {
        public partial class FormNetToCom : Form
        {
            public FormNetToCom()
            {
                InitializeComponent();
            }
     
            private void btnCallActiveXVB6_Click(object sender, EventArgs e)
            {
                C_Task taskCom = new C_Task();
                taskCom.NomPerso = "Alibaba";
                taskCom.NomTache = "Aladin";
                //valeurs avant appel
                this.label1.Text = taskCom.NomPerso;
                this.label2.Text = taskCom.NomTache;
     
                CTaskVB taskvb6 = new CTaskVB();
                taskvb6.Task = taskCom;
                taskvb6.GetTache();
                //valeurs apres appel
                this.label3.Text = taskvb6.Task.NomPerso;
                this.label4.Text = taskvb6.Task.NomTache;
            }
        }
    }
    L'orde de generation des projets est l'ordre ou j'ai poste les projets(a cause des references)......
    1/projet LibNetToCom
    2/projet MyDLLVBNetToCOM
    3/projet WinCSharVB6NetToCom
    bon code....................

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Merci pour ta réponse, c'est très intéressant.
    Cela traite d'un problème rencontré souvent en entreprise pour des projets de rénovation.

    Par contre, vu que tu as répondu un peu tard et que j'étais pressé, je suis parti sur un mix de la première solution à savoir une classe VB6 COM que j'utilise en C#, c'est plus simple au final.

    Merci pour ces précisions

Discussions similaires

  1. Utilisation d'une instance dans une page importée
    Par blackstrobe dans le forum Langage
    Réponses: 2
    Dernier message: 04/02/2015, 09h55
  2. Utilisation d'une classe C# dans VB6
    Par AventixSC dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/11/2012, 09h44
  3. [Introspection] Dumper une instance d'objet VB6 en XML
    Par MacReiben dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 25/03/2009, 10h46
  4. [VB6]Passer le focus à une instance précedente
    Par Jeremiah dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 16/09/2003, 10h01
  5. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19

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