PurBonheur
Messages postés66Date d'inscriptionsamedi 24 février 2007StatutMembreDernière intervention 7 octobre 2007
-
29 juil. 2007 à 19:56
PurBonheur
Messages postés66Date d'inscriptionsamedi 24 février 2007StatutMembreDerniè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();
P0lO
Messages postés65Date d'inscriptionmercredi 18 avril 2007StatutMembreDernière intervention12 juin 20081 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.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 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 ).
PurBonheur
Messages postés66Date d'inscriptionsamedi 24 février 2007StatutMembreDernière intervention 7 octobre 20071 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 ?
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 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...
PurBonheur
Messages postés66Date d'inscriptionsamedi 24 février 2007StatutMembreDernière intervention 7 octobre 20071 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.