Rendre visible les méthodes et propriétés d'un objet COM [Résolu]

PurBonheur 66 Messages postés samedi 24 février 2007Date d'inscription 7 octobre 2007 Dernière intervention - 29 juil. 2007 à 19:56 - Dernière réponse : PurBonheur 66 Messages postés samedi 24 février 2007Date d'inscription 7 octobre 2007 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
P0lO 65 Messages postés mercredi 18 avril 2007Date d'inscription 12 juin 2008 Dernière intervention - 8 août 2007 à 10:06
3
Merci
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)

Merci P0lO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de P0lO
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 29 juil. 2007 à 21:23
0
Merci
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 ).
Commenter la réponse de Lutinore
PurBonheur 66 Messages postés samedi 24 février 2007Date d'inscription 7 octobre 2007 Dernière intervention - 29 juil. 2007 à 22:22
0
Merci
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.
Commenter la réponse de PurBonheur
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 29 juil. 2007 à 22:43
0
Merci
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.
Commenter la réponse de Lutinore
ShareVB 2717 Messages postés vendredi 28 juin 2002Date d'inscription 13 janvier 2016 Dernière intervention - 30 juil. 2007 à 23:07
0
Merci
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
Commenter la réponse de ShareVB
PurBonheur 66 Messages postés samedi 24 février 2007Date d'inscription 7 octobre 2007 Dernière intervention - 12 août 2007 à 16:36
0
Merci
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.
Commenter la réponse de PurBonheur
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 12 août 2007 à 22:52
0
Merci
Ca peut peut-être t'aider :

COM and .NET Interoperability
http://www.apress.com/free/index.html
Commenter la réponse de Lutinore
PurBonheur 66 Messages postés samedi 24 février 2007Date d'inscription 7 octobre 2007 Dernière intervention - 13 août 2007 à 08:20
0
Merci
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.
Commenter la réponse de PurBonheur

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.