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 :

une exception 'System.Runtime.InteropServices.COMException


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut une exception 'System.Runtime.InteropServices.COMException
    Bonjour,
    Dans mon application developpée en vs2008, j'ai ajouté une référence "myapp.tlb" et j'ai utilisé cette référence pour appelé un objet com
    mais j'ai eu l'exeption suivante
    Une exception non gérée du type 'System.Runtime.InteropServices.COMException' s'est produite dans mscorlib.dll
    je sais pas quelle est la source du problème
    Merci pour vos aides

  2. #2
    Membre averti Avatar de MigsFR
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Bonjour,

    Si tu veux qu'on t'aide je pense qu'il va falloir un minimum de détails:

    • Qu'est-ce qu'un fichier tlb ?
    • Le code qui pose problème avec le numéro de la ligne qui lance l'exception.

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Citation Envoyé par MigsFR Voir le message
    [*]Qu'est-ce qu'un fichier tlb ?
    MigsFR, si tu ne connais pas c'est quoi un fichier .tlb donc tu peux pas m'aider
    un fichier tlb est une fichier généré à partir d'une application Automation Server
    et je veux utiliser les méthodes exposées par serveur dans une application cliente (mon application en c#)
    et voici le code du client(c'est un code LABVIEW)
    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    using System;
    using System.IO;
    using LabVIEW;
     
    namespace CallingLabVIEWFromCSharpUsingActiveX
    {
    	class Class1
    	{
    		/// <summary>
    		/// The main entry point for the application.
    		/// </summary>
    		[STAThread]
    		static void Main()
    		{
                _Application labVIEWApp = new ApplicationClass();
     
                if (labVIEWApp == null) 
                {
                    Console.WriteLine("CallsVIThroughActiveX : An error occurred getting labVIEWApp");
                    return;
                }
     
                // Run the LabVIEW example "robot.vi"
                RunRobotVI(labVIEWApp);
     
                labVIEWApp.Quit();
            }
     
            // Run the example VI robot.vi asynchronously. While the VI is running, set control values
            // to control the robot arm. Then, stop the VI by setting the "stop" control to true. Running
            // a VI is more like pushing the run button on a VI as compared to calling a subVI.
            static void RunRobotVI(_Application labVIEWApp)
            {
    	        string viPath = Path.Combine(labVIEWApp.ApplicationDirectory, @"examples\picture\robot.llb\robot.vi");
     
    	        // Assign an object reference to vi
    	        VirtualInstrument vi = labVIEWApp.GetVIReference(viPath, "", false, 0);
    	        if (null == vi) 
                {
    		        Console.WriteLine("RunRobotVI : An error occurred getting vi");
    		        return;
    	        }
     
    	        // Setting vi.ShowFPOnCall to true will not open the front panel when using the "Run" method.
    	        // Must explicitly open the front panel and then close it when done.
    	        vi.OpenFrontPanel(true, FPStateEnum.eVisible); 
     
    	        // Use the "Run" method to run the VI. This is like pushing the run button on a VI inside LabVIEW.
    	        // Use the "Call" or "Call2" methods to call a VI more like a subVI or a function call.
    	        vi.Run(true);
     
    	        // Change joint values on the robot arm
    	        for (int i = 0; i < 100; ++i) 
                {
    		        double value = (double)i / 10.0;
    		        vi.SetControlValue("Joint A", value);
    		        vi.SetControlValue("Joint B", value);
    		        vi.SetControlValue("Claw Joint", value);
     
    		        System.Threading.Thread.Sleep(5);
    	        }
     
    	        // Stop the robot VI by setting the stop button to true
    	        vi.SetControlValue("stop", true);
     
    	        // Close the front panel.
    	        // Note: Setting vi.CloseFPAfterCall to true will not close the panel when using the "Run" method.
                vi.CloseFrontPanel();
     
    	        // Get some control values from the VI
    	        double jointA = (double)vi.GetControlValue("Joint A");
    	        double jointB = (double)vi.GetControlValue("Joint B");
    	        double clawJoint = (double)vi.GetControlValue("Claw Joint");
     
    	        Console.WriteLine("Robot.vi - Get Control Values");
    	        Console.WriteLine("JointA = " + jointA + ", JointB = " + jointB + ", ClawJoint = " + clawJoint);
                Console.WriteLine("");
            }
    j'ai généré ce code et il engendre l'exeption ci haut

    Merci d'avance

  4. #4
    Membre averti Avatar de MigsFR
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    MigsFR, si tu ne connais pas c'est quoi un fichier .tlb donc tu peux pas m'aider
    un fichier tlb est une fichier généré à partir d'une application Automation Server
    et je veux utiliser les méthodes exposées par serveur dans une application cliente (mon application en c#)
    Maintenant je sais ce c'est

    J'ai déjà fait de l'interop et ce genre d'exception peut apparaître quand tu ne respecte pas le contrat (ex: appel à une méthode qui n'existe pas).

    Maintenant c'est jamais facile de débugger sans plus de détail. As-tu essayé d'arrêter le programme à l'exception? (menu Debug -> Exceptions).

  5. #5
    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 hresult exception com
    Bonjour Aychoucha
    primo tu as reference naivement ton tlb,mais c'est rate car il faut l'enregistrer dans le registre windows.Ce n'est aussi simple ,mon cher aychoucha,ce serait trop facile.

    tu as reference le fichier tlb qui est un fichier binaire du source IDL(ascii).
    il decrit une l'interface Com :nom d'interface,ses classe avec var membres,prop et methodes du fichier .dll librairie qui l'accompagne.

    En cas de probleme avec le tlb ,il y a un inspecteur microsoft de tous les tlb enregistres sur ta machine(et seul dieu sait combien):
    1/si n'est deja fait completer ton installation en ajoutant Microsoft Windows
    SDK avec tous les outils.

    1/allez sur microsoft window SDK V.06 ->TOOLS>OLE COM-Object Viewer->click

    2/dans la fenetre de droite de OLE COM-Object Viewer
    ouvrir Type Librairies->rechercher votre nom de fichier tlb(ordre alphabetique)->double-click dessus
    et vous etes dans le fameux source IDL O Christophe Colomb,tu peux comptempler le source IDL et les iles Jamaiques

    pour en revenir à ton probleme :
    -il ne suffit pas de referencer le fichier .tlb il faut en plus l'enregistrer sur le registre windows.
    Alors 2 cas se presente :
    -le .tlb est un "vrai" .tlb genere dans l'environnement "com" traditionnel (vc++ 6,vb6,c++builder ) ,utiliser l'utilitaire regsver32.exe
    windows->executer:regsver32.exe nomfichier.tlb->enter.
    Ce .tlb possede toujours un compagnon dans le meme repertoire son fichier.dll

    -le .tlb est un "substitut" genere par VS.NET ,c.a.d n'est pas un vrai "com" car son compagnon fichier .dll contient un wrapper CCW(com callable) inclus.
    utiliser Regasm.exe pour l'enregister
    windows->executer:regasm.exe nomfichier.dll/ nomfichier.tlb->enter.
    cette commande l'enregiste.
    un coup d'oeil avec OLE COM Viewer te le confirmera.
    OleViewer te donne meme le chemin d'installation car oleviewer lit le registre windows.
    rabi yatikoum essber.....
    bonjour à tous les gens de tunis....
    bon code ......

  6. #6
    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 com ,hresult exception
    rebonjour
    un petit detail vital dans l'interop.com pour eviter les abus:
    1/un vrai "tlb" com peut etre referencer dans VS NET=> s'il a ete enregistrer avec regsver32.exe sur la machine.

    2/un "substitut" .tlb genere dans VS .NET ne peut etre reference dans VS.NET et se soldera par un echec.
    explication tres simple:
    -VS .NET est dispose à creer un wrapper RCW pour la "vrai" .dll COM(ou le controle Activex Com) et un fichier.tlb ,puis à l'enregistrer.
    -VS .NET refusera de referencerer un ".tlb " substitut qu'il a lui meme cree à partir de l'assembly d'origine car ce .tllb a ete generer pour etre utilise dans une appli com.
    il ne faut pas donc tomber dans des cercles vertueux ou vicieux.......
    bonne soiree..........

  7. #7
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour Mr MABROUKI,
    Merci pour les explications
    En fait, moi j'ai enregistré mon tlb avec regtlibv12 et j'ai bien vérifié avec le OLE-COM Object Viewer qu'elle existe, aussi dans la base des registres
    Si j’exécute mon code, l'application serveur est lancée sauf qu'elle génère cette exception
    Je sais pas alors quelle est le pb
    Dois-je ré-enregistrer le tlb une autre fois avec les commandes ci haut
    c'est au niveau de ce code que ça plante
    Merci

  8. #8
    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 labview,exception interop
    bonjour
    pour une variable de type application com ,tu peux appeler egalement appelez directement l'interface
    l'interface portent dans l'intellisense _ avec le meme nom
    ceci est mentionne la doc msdn pour les objets de type application
    voici ce que je veux dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     
    _Application   _labVIEWApp = new ApplicationClass();
    il y a aussi une autre piste voir dans OleViewer si le parametre-True-Booleen-a ete engregistre comme un -Boolean- dans la methode Run de l'Application Vi ou si c'est un integer (0-1) à toutes fins utiles....
    Il y a un probleme de fidelite de traduction des types signale par microsoft MDSN concernant TYPELIBIMPORTER.EXE(TLBIMP.EXE) qui est utilise par VS en coulisse pour creer l'assembly interop lorsque on reference un .tlb dans VS
    bon code.........

  9. #9
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    Merci Mabrouki,
    J'ai enlevé cette ligne car j'ai pas trouvé la source du problème
    j'ai essayé toutes les possibilités avec 0-1 avec () mais tjrs la même exception
    Merci

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

Discussions similaires

  1. [SP-2010] Exception de type : System.Runtime.InteropServices.COMException
    Par ciresamba dans le forum SharePoint
    Réponses: 10
    Dernier message: 09/09/2013, 13h54
  2. System.Runtime.InteropServices.COMException Service WCF
    Par Carmel_O dans le forum Windows Communication Foundation
    Réponses: 6
    Dernier message: 18/03/2010, 20h15
  3. runtime.interopServices / COMException /
    Par axialle dans le forum ASP.NET
    Réponses: 3
    Dernier message: 10/11/2009, 23h35
  4. message d'erreur sur System.Runtime.InteropServices
    Par l_achraf dans le forum VB.NET
    Réponses: 2
    Dernier message: 15/04/2009, 16h07
  5. Réponses: 1
    Dernier message: 02/07/2008, 11h21

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