Rendre visible les méthodes et propriétés d'un objet COM

Résolu
PurBonheur Messages postés 66 Date d'inscription samedi 24 février 2007 Statut Membre Dernière intervention 7 octobre 2007 - 29 juil. 2007 à 19:56
PurBonheur Messages postés 66 Date d'inscription samedi 24 février 2007 Statut Membre Dernière intervention 7 octobre 2007 - 13 août 2007 à 08:20
Salut, je suis entrain de découvrire les objets COM en VBS et je souhaiterais faire un objet COM en C# pour pouvoir l'utiliser dans un script VBS. J'ai donc décider de me faire la main avec un petit truc de rien du tout. Le controle COM expose une méthode GetLogin() ainsi que deux propriétés Username et Password. Le script VBS fait ceci :

Dim  Login
Set  Login = WScript.CreateObject("EasyCompany.ClassLogin")
If  Login.GetLogin = True Then
    MsgBox ("Nom : " & Login.UserName & "   et Mot de passe : " & Login.Password)
Else
    MsgBox("Annulé")
End If

Ca marche bien. Si je regarde la DLL avec l'explorateur d'objet de visual studio , il me montre la méthode et les deux propriétés, mais sans les commentaires XML que j'ai inclut dans le code (/// <summary> ...). De plus si j'ouvre la DLL avec l'outil fournis par Microsoft (OLE/COM Viewer)  et que j'explore le controle COM, il ne me montre ni la méthode ni les propriétés exposés. Pareil avec l'explorateur d'objet de VbsEdit.
Voilà comment je définis la méthode et les propriétés :

/// <summary>
/// Renvois de nom de l'utilisateur
/// </summary>
public string Username
        { get { return _Username; } }

/// <summary>
/// Renvois le mot de passe de l'utilisateur
/// </summary>
public string Password
        { get { return _Password; } }

/// <summary>
/// Fait apparaitre le formulaire pour demander à l'utilisateur de rentrer son login et son mot de passe.
/// </summary>
/// <returns>Renvois true si l'utilisateur à cliqué sur Ok sinon False (Cancel)</returns>
public Boolean GetLogin()
{
            System.Windows.Forms.DialogResult reponse;

            _Username = "";
            _Password = "";

            using (FrmMain Formulaire = new FrmMain())
            {
                reponse = Formulaire.ShowDialog();

                if (reponse == System.Windows.Forms.DialogResult.OK)
                {
                    _Username = Formulaire.TxtBxName.Text;
                    _Password = Formulaire.TxtBxPassword.Text;
                    return true;
                }
                else
                { return false; }
            }

}

Alors Question : Comment faire pour que les méthodes et propriétés public soit visible avec OLE/COM Viewer et VbsEdit ?

Merci.

8 réponses

P0lO Messages postés 65 Date d'inscription mercredi 18 avril 2007 Statut Membre Dernière intervention 12 juin 2008 1
8 août 2007 à 10:06
Bonjour!
Sa fait plaisir de voir que je suis pas le seul à avoir galéré avec les objets COM en C#!

Un truc que je n'ais pas compris c'est ton script fonctionne????????Si oui c'est louche car ce que tu as déclaré est une classe utilisable dans n'importe qu'elle language .NET mais pas un objet COM... VBS est un langage .NET?

- Premièrement il faut savoir que pour voir des méthodes propriété et autre dans un objets COM il faut que tu passe la propriété de ton assembly ComVisible à true pour cela ouvre la fichier assemblyinfo.cs de ton projet (dans l'explorateur de solution il se trouve dans propriétés)...

- Ensuite tu doit signer ton assembly avec un fichier de nom fort, pour cela clic droit sur ton projet (dans visual studio) propriétés, signature ensuite tu clic signer l'assembly et tu cré ton fichier (tu aura juste à choisir son nom)...

- Si tu cré un objet en .NET ta dll est utilisable et visible dans tout les langages .NET, après pour les autres langages tu doit utiliser le fichier .tlb...

Une fois que tu en est la tu doit savoir que pour créer un objet COM il ne suffit pas de faire une classe et de cocher inscrire pour COM Interop sa serais trop facile (et oui sinon tout le monde ferais des bibliothèques COM tant qu'a faire), lorsque tu inscrit pour COM Interop tu dit juste à visual studio d'éxécuter tlbexp.exe sur ta dll...

Pour créer un "vrai" objet COM fonctionnel il est nécéssaire de réspécter certaines règles (si tu veut pas lire descend ya un exemple après) :
- Utilisation des générics interdite (ce qui veut dire que tu à le droit de les utilisé en interne mais tes méthodes ne peuvent pas avoir en paramètre un généric ou en retourner un, idem pour les propriétés)
- Tout ce qui est publique doit être numéroté via l'attribut DipsId
- Toutes classe doit avoir une interface
- Toutes classe doit être identifié via un Guid
- ... (ya encore d'autre règle mais un exemple sera plus simple)

Exemple (fait dans WordPad alors soyez indulgent) :

using System;
using System.Runtime.InteropServices;

namespace MonNameSpace
{
    #region Evènements de ta classe COM

    public delegate void MonEventHandler();

    [Guid("GUID1"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IMaClasseEvent
    {
        [DispId(1)]
        void MonEvent();
    }

    #endregion

    #region Interface de ta classe COM

    [Guid("GUID2"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IMaClasse
    {
        [DispId(1)]
        void MaFonction();
        [DispId(2)]
        int MonAttribut { get; set;}
    }

    #endregion

    #region Ta Classe COM

    [Guid("GUID3"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IMaClasseEvent))]
    public class MaClasse : IMaClasse
    {
        public event MonEventHandler MonEvent;

        //Ta classe doit obligatoirement posséder un constructeur publique sans paramètres
        public MaClasse() : base()
        {
        }

        public void MaFonction()
        {}
       
        public int MonAttribut
        {
            get;
            set;
        }
    }

    #endregion
}

Voila grosso modo ce qu'il faut réspécter.
Je vais faire un tuto sur les objets COM en C# dès que j'aurais un peu de temps...

En éspérant avoir aidé (n'hésité pas à me contacter en cas de problèmes), cordialement.

CHERPITEL Paul (fan_ff60@hotmail.com)
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
29 juil. 2007 à 21:23
Salut, pour les commentaires XML, il faut également générer le fichier XML ( dans les options du projet ou en ligne de commande ), les commentaires ne sont pas inclus dans l'assembly.

J'ai pas l'habitude d'utiliser des wrappers .NET vers COM mais plutôt l'inverse.. Je pense que c'est logique que OLEViewer ne sache pas lire ton objet .NET, c'est pendant l'exécution que le CLR créer implicitement un wrapper CCW qui permet d'utiliser un objet .NET vers COM. Essayes plutôt de créer la librairie de type ( *.tlb) avec l'outil en ligne de commande tlbexp.exe ( dans le SDK ).
0
PurBonheur Messages postés 66 Date d'inscription samedi 24 février 2007 Statut Membre Dernière intervention 7 octobre 2007 1
29 juil. 2007 à 22:22
Salut, merci pour la réponse. J'ai demandé la génértion du fichier XML, le fichier ses créer mais toujours rien dans VbsEdit ni OLEViewer.
Pour le fichier *.tlb, visual studio me le fait déjà, car j'ai mis dans les paramètre de ma solution d'inscrire pour com interop (onglet générer).

Comment se fait il que quand je fait une référence à "Word.Application" VbsEdit, il me permet de voir toutes les méthodes avec leurs signatures, ainsi que les propriétés, alors que je ne vois rien avec mon controle ?
Est ce seulement possible avec un controle .Net ?

A plus.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
29 juil. 2007 à 22:43
Le fichier XML c'est pour voir ( entre autre ) les commentaires dans l'explorateur d'objets de VS. Je t'ai dit je suis habitué aux wrappers COM vers .NET mais pas l'inverse alors je veux pas dire de betises, mais à mons avis OLEViewer peut lire le fichier TLB mais pas le fichier de l'assembly  .NET.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
30 juil. 2007 à 23:07
salut,

tu ne peux voir ton type qu'au travers de ta tlb et non à travers ta dll...si ta tlb est enregistrée, essaies de la trouver dans le liste disponible..si tu as tes types mais avec rien dedans, il applique l'attribut [ClassInterface(ClassInterfaceType.AutoDual)] à ta classe que tu exportes...enfin, de toute façon, à part que c'est plus simple à programmer avec l'autocomplétion mais sinon, le vbs ne fait que des liaisons tardives...donc il n'a pas besoin de connaitre ta tlb...il résoud le nom des méthodes à l'exécution...

ShareVB
0
PurBonheur Messages postés 66 Date d'inscription samedi 24 février 2007 Statut Membre Dernière intervention 7 octobre 2007 1
12 août 2007 à 16:36
Salut,

' Sa fait plaisir de voir que je suis pas le seul à avoir galéré avec les objets COM en C#! '
Moi aussi ca me fait plaisir de voir qlq'un qui partage mes galères.

'Un truc que je n'ais pas compris c'est ton script fonctionne????????'
Oui, il marche même très bien.

' VBS est un langage .NET ? '
Non, mais c'est un langage orienté objet, donc je peut instancier des objets.

J'ai jeté un coup d'oeil à ton exemple, et je dois dire que cela m'a l'air bien compliqué. Je vais éssayer de trouver des livres sur le sujets.

Je serais très interessé par ton tutorial. Je vais surveiller ca de près.

A plus.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 août 2007 à 22:52
Ca peut peut-être t'aider :

COM and .NET Interoperability
http://www.apress.com/free/index.html
0
PurBonheur Messages postés 66 Date d'inscription samedi 24 février 2007 Statut Membre Dernière intervention 7 octobre 2007 1
13 août 2007 à 08:20
Salut,

'COM and .NET Interoperability
http://www.apress.com/free/index.html'

Oui, je l'ai, mais j'ai pas commencé à le lire. J'aurais préféré un bouquin en français.

A plus.
0
Rejoignez-nous