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 :

CLient COM .Net pour Serveur COM OutProc en C++ VS6


Sujet :

C#

  1. #1
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 6
    Points : 4
    Points
    4
    Par défaut CLient COM .Net pour Serveur COM OutProc en C++ VS6
    Bonjour

    J'ai cherché sur le forum et je n'ai malheuresementpas pu trouvé réponse à ma question, de même que sur le reste du web, j'espere que ce n'est pas faute d'avoir chercher, si c'est le cas je m'en excuse.

    Alors voila mon probleme :

    Ce que je veut faire en fait c'est de créer un client (COM) en .Net qui permet de se connecter sur un serveur COM exécutable (outproc) développé en C++ VS 6, pour pouvoir bénéficier des méthodes fournies par les interfaces COM.

    Pourriez vous m'éclairez sur ce point s'il vous plaît ?

    Il y a une Interface et deux méthodes disponible par le serveur COM ... voici le fichier idl utilisé pour générer la dll Proxy.dll :

    import "unknwn.idl";

    //-------------------------------------------- Interfaces Definition
    [ object,
    uuid(101DD6E9-78C9-42c2-99A3-AE1B6B56C078),
    pointer_default(ref)
    ]
    interface ITestInterface : IUnknown
    {
    HRESULT TestMethod([in] int x,[in] int y);
    HRESULT TestCall();
    }


    //-------------------------------------------- COM Object

    [
    uuid(826D4EC6-B49B-4baa-BCC7-E10ADCBB81B7),
    version(1.0),
    helpstring("Test Connection point")
    ]
    library RASTACOMServerLib
    {
    importlib("stdole32.tlb");
    [uuid(6166C4FE-7247-4781-B065-A6B1984F6C64)]
    coclass RASTACOMObject
    {
    [default] interface ITestInterface;
    }
    }
    j'ai cru comprendre quelque part qu'il faut utilsié MarshalAs .. mais je sais pas où .. dans le fichier idl ? inclure cela dans le client .Net ? comment appeler les méthodes qui sont interfacées au sein du code .NEt ?

    Merci a ucas où vous avait lu jusqu'à la fin

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut COM en .Net...
    Bonjour,

    déjà, pour utiliser le serveur COM (outproc) en .Net, il va falloir créer un "mapping" permettant l'utilisation de ce composant COM depuis une assembly .Net. Pour se faire, il faut ajouter la référence de l'objet COM dans le projet .Net.

    Pour que l'assembly soit utilisable en COM, il faudra, dans les propriétés de cette assembly, activer l'option "Inscrire pour COM Interop".

    Cordialement.

    Guillaume MARQUES

  3. #3
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour la réponse... qu'est ce que tu veut dire par "Pour que l'assembly soit utilisable en COM, il faudra, dans les propriétés de cette assembly, activer l'option "Inscrire pour COM Interop"." .. d'un point de vue code ?

    Entre temps (pendant le week end) j'ai pu avancer grace au Tutorial présent dans msdn :
    http://msdn2.microsoft.com/en-US/lib...36(VS.71).aspx
    qui décrit comment créer un cleint .net d'un objet com, soit par la méthode simple de conversion de dll par tlbimp, soit par mappage manuel de l'interface COM chez le client .Net

    Vous me direz mais qu'est ce que tu fai encore sur le forum si t'a deja la réponse ? :p et ben voyez vous j'ai toujour un probléme ... en effet lors de la génération puis de l'execution, j'obtiens un pépein au niveau de l'instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProxyLib.ITestInterface mc = (ProxyLib.ITestInterface) bridger;
    qui est sensée etre l'equivalent de QueryInterface pour l'interface ITestInterface, le systeme me notifie l'exception :
    Le cast spécifié n'est pas valide.

    JE vous met tout le code vu qu'il est petit :

    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
    // client dont net pour serveur COM
     
    using System;
    using System.Runtime.InteropServices;
     
    namespace ProxyLib 
    // declaration de l'itnerface com ...
    {
    	[ComVisible(true), ComImport,
    	Guid("56A868B1-0AD4-11CE-B03A-0020AF0BA770"), 
    	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] 
    	internal interface ITestInterface
    	{ 	
    		void TestMethod([In] int x,[In] int y);
     
    		void TestCall();
    	}
     
    	[ComImport, Guid("6166C4FE-7247-4781-B065-A6B1984F6C64")] 
    	class ZSIBridge 	
    	{ 
     
    	}
    }
     
    class MainClass 
    { 
    	public static void Main(string[] args) 
    	{ 
     
    		// Crée l'instance de GSIBridge 
    		// (appelle CoCreateInstance(6166C4FE-7247-4781-B065-A6B1984F6C64, 
    		//  NULL, CLSCTX_ALL, IID_IUnknown, 
    		//  &bridger).):
    		try
    		{
    			ProxyLib.ZSIBridge bridger =
    				new ProxyLib.ZSIBridge();
     
    			// QueryInterface pour l'interface ITestInterface :
    			ProxyLib.ITestInterface mc = (ProxyLib.ITestInterface) bridger;
     
    			// Appelle des méthodes sur l'interface COM.
    		//	mc.TestMethod(3,4); 
    		//	mc.TestRPCg2();
    		}
    		catch(Exception ex)
    		{
    			Console.WriteLine("Exception COM inattendue : " + ex.Message);
    		}
    		Console.WriteLine("no exceptions .. ? ");
    		// Attend la fin de l'exécution. 
    		Console.WriteLine("Appuyez sur ENTRÉE pour continuer."); 
    		Console.ReadLine();
    	}
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    dans les propriétés du PROJET (dans Visual Studio) il faut activer l'option "Inscrire pour COM Interop" ce qui réalisera l'exportation des interfaces .Net vers un fichier tlb utilisable en C++ / VB etc...

    Est-ce que l'objet de type ProxyLib.ZSIBridge implémente bien l'interface ITestInterface ?

    Il faut peut-être d'ailleurs préférer l'instruction as (ou is) à un cast.

    Cordialement

  5. #5
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    j'ai modifié le code pour faire avec le as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    			object bridger = null;
    			bridger = new ProxyLib.ZSIBridge();
     
    			// QueryInterface pour l'interface ITestInterface :
    			//ProxyLib.ITestInterface mc = (ProxyLib.ITestInterface) bridger;
    			ProxyLib.ITestInterface mc = null;
    			mc = bridger as ProxyLib.ITestInterface;
     
    			// Appelle des méthodes sur l'interface COM.
    		//	mc.TestMethod(3,4); 
    			mc.TestRPCg2();
    et il ne me sort plus l'erreur pour la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mc = bridger as ProxyLib.ITestInterface;
    mais plutot lors de l'appe lde méthode : l'exception envoyée est :
    "La référence d'objet n'est pas définie à une instance
    d'un objet."
    PS :
    J'ai essayé de changer le parametre "Inscrire Pour COM Interop" dans les propriétés du projet et bien que j'ai trouvé le champs en question il ne veut pas changer (il est en gris ...).
    et ee merci pour l'aide

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut Plom Plom Plom Plom...
    Si l'objet mc est à null une fois que tu es passé sur l'instruction

    [FONT=monospace][/FONT]mc = bridger as ProxyLib.ITestInterface;

    c'est dans ce cas que ta classe ProxyLib.ZSIBridge(); ne doit pas implémenter l'interface ITestInterface...

    Peux-tu donner le code complet de la classe ProxyLib.ZSIBridge()...

    Merci d'avance.

    De plus il faudrait que tu modifies ton code comme ci-dessous:

    ProxyLib.ZSIBridge bridger = null;
    bridger = new ProxyLib.ZSIBridge();
    // QueryInterface pour l'interface ITestInterface :
    //ProxyLib.ITestInterface mc = (ProxyLib.ITestInterface) bridger;
    ProxyLib.ITestInterface mc = null;
    mc = bridger as ProxyLib.ITestInterface;

    // Appelle des méthodes sur l'interface COM.
    // mc.TestMethod(3,4);
    mc.TestRPCg2();

  7. #7
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    voici le code de l'interface ITestInterface et de l'objet ZSIObject :

    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
    namespace ProxyLib 
    {
    	[ComVisible(true), ComImport,
    	Guid("56A868B1-0AD4-11CE-B03A-0020AF0BA770"), 
    	InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] 
    	internal interface ITestInterface   // Impossible de répertorier les interfaces de base ici 
    	{ 
    		// Remarquez que les membres de l'interface IUnknown NE sont PAS répertoriés ici
     
    		void TestMethod([In] int x,[In] int y);
     
     
    		void TestRPCg2();
    	}
     
    	// Déclare ZSIBridge en tant que coclasse COM :
    	[ComImport, Guid("6166C4FE-7247-4781-B065-A6B1984F6C64")] 
    	class ZSIBridge   // Impossible d'avoir une classe de base ou
    		// une liste d'interfaces ici.
    	{ 
    		// Impossible d'avoir des membres ici 
    		// NOTEZ que le compilateur C# ajoutera un constructeur par défaut
    		// (aucun paramètre).
    	}
    }
    le serveur COM se lance aprés l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bridger = new ProxyLib.ZSIBridge();
    mais j'obtiens toujour la meme erreur quand j'essaie d'utiliser l'interface avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mc = bridger as ProxyLib.ITestInterface;
    mc.TestRPCg2()
    qui est :
    "La référence d'objet n'est pas définie à une instance d'un objet."

    il me semble que j'ai fait uen betise dans la déclaration de l'interface mais je ne sais pas où ...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut
    // Déclare ZSIBridge en tant que coclasse COM :
    [ComImport, Guid("6166C4FE-7247-4781-B065-A6B1984F6C64")]
    class ZSIBridge : ITestInterface // Impossible d'avoir une classe de base ou
    // une liste d'interfaces ici.
    {
    Ici il faut coder une classe C# normale... avec ses membres
    ses méthodes, LES METHODES DE L'INTERFACE etc...

    }

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Points : 62
    Points
    62
    Par défaut Codage...
    Le développement C# que vous voulez faire doit être un développement .Net de base, utilisant une interface, et c'est cette interface, ajouté à un tlbexp (ou la case cochée dans les propriétés du projet) qui fera que ta classe .Net sera visible comme un composant COM depuis un programme en C++ par exemple.

  10. #10
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par guillaumemarques
    Le développement C# que vous voulez faire doit être un développement .Net de base, utilisant une interface, et c'est cette interface, ajouté à un tlbexp (ou la case cochée dans les propriétés du projet) qui fera que ta classe .Net sera visible comme un composant COM depuis un programme en C++ par exemple.
    Bonjour,

    En fait c'est le contraire que je veut faire, j'ai un objet COM existant déja développé en C++ V6 que je veut utiliser en C# par un appel d'interface.

    Ca a finalement marché ! ouf ! L'erreur été dans le guid de l'interface, qui été pas le bon, j'avais oublier de le changer ... 2 jours "perdus" à cause de cela ! MAis bon pas grave, cela m'a permis de découvrir plein de truc

    voila donc la méthode expliquée ci dessus est la bonne pour utiliser un objet COM à partir d'un client .Net en C#.

    MErci Guillaume pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/01/2012, 18h33
  2. Réponses: 1
    Dernier message: 22/12/2009, 14h06
  3. Réponses: 1
    Dernier message: 02/10/2007, 10h38
  4. passer une chaine de caractère entre client et serveur COM
    Par ali.ensi dans le forum Visual C++
    Réponses: 7
    Dernier message: 28/03/2007, 17h30
  5. Reference COM, .Net pour projet VB
    Par kaskarot dans le forum VB.NET
    Réponses: 2
    Dernier message: 05/01/2007, 16h23

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