none
Impossible d'utiliser les évènements de ma classe Vb6 dans mon projet VbNet: FILENOTFOUNDEXCEPTION ou INVALIDOPERATIONEXCEPTION RRS feed

  • Question

  • Bonjour,
    Voici un problème que je n'arrive pas à résoudre. Comme je suis encore débutant en .NET, je pense louper quelque chose qui sera peut-être évident pour vous.
    Je suis sous Visual Studio 2008 (XP SP3), j'essaye d'utiliser dans un petit projet VbNet une DLL Vb6 que j'ai donc mis en référence dans le projet.

    CONTEXTE N°1

    Je déclare ma classe Vb6 avec WithEvents:

    Public WithEvents clsClientFct As SURVENetClientFct.ClientFct = New SURVENetClientFct.ClientFct With {...}
    

    Je peux utiliser les méthode de ma classe sans problème ... jusque là tout va bien.

    Dés que je renseigne un évènement comme par exemple celui-ci:

        Private Sub clsClientFct_ELogEvent(ByVal strLogData As String) Handles clsClientFct.ELogEvent
            Debug.WriteLine("clsClientFct_ELogEvent: " & strLogData)
        End Sub
    

    ... j'ai immédiatement l'erreur à l'exécution SYSTEM.INVALIDOPERATIONEXCEPTION :

    L'exception System.InvalidOperationException n'a pas été gérée
      Message="Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : Le fichier spécifié est introuvable. (Exception de HRESULT : 0x80070002)"
      Source="Test_TCPIP"
      StackTrace:
           à WindowsApplication1.My.MyProject.MyForms.Create__Instance__[T](T Instance) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 190
           à WindowsApplication1.My.MyProject.MyForms.get_Form1()
           à WindowsApplication1.My.MyApplication.OnCreateMainForm() dans E:\Sample\Test_VbNet\TCPIP\Test_TCPIP\Test_TCPIP\My Project\Application.Designer.vb:ligne 35
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           à WindowsApplication1.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
           à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()
      InnerException: System.IO.FileNotFoundException
           Message="Le fichier spécifié est introuvable. (Exception de HRESULT : 0x80070002)"
           Source="mscorlib"
           StackTrace:
                à System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(Object pUnkSink, Int32& pdwCookie)
                à SURVENetClientFct.__ClientFct_EventProvider.add_ELogEvent(__ClientFct_ELogEventEventHandler )
                à SURVENetClientFct.ClientFctClass.add_ELogEvent(__ClientFct_ELogEventEventHandler )
                à WindowsApplication1.Form1.set_clsClientFct(ClientFct WithEventsValue)
                à WindowsApplication1.Form1..ctor() dans E:\Sample\Test_VbNet\TCPIP\Test_TCPIP\Test_TCPIP\Form1.vb:ligne 9
           InnerException
    
    

    CONTEXTE N°2

    Je déclare ma classe Vb6 SANS WithEvents:

        Public clsClientFct As SURVENetClientFct.ClientFct = New SURVENetClientFct.ClientFct With {...}
    

    Tant que je ne déclare pas de gestionnaire d'évènement, tout va bien, je peux utiliser les méthodes de la classe...

    Dés que je déclare un gestionnaire d'évènement comme celui-ci:

            AddHandler clsClientFct.ELogEvent, AddressOf clsClientFct_ELogEvent
    
        Public Sub clsClientFct_ELogEvent(ByVal strLogData As String)
            Debug.WriteLine(strLogData)
        End Sub
    

    ... j'ai immédiatement l'erreur à l'exécution SYSTEM.O.FILENOTFOUNDEXCEPTION

    L'exception System.IO.FileNotFoundException n'a pas été gérée
      Message="Le fichier spécifié est introuvable. (Exception de HRESULT : 0x80070002)"
      Source="mscorlib"
      StackTrace:
           à System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(Object pUnkSink, Int32& pdwCookie)
           à SURVENetClientFct.__ClientFct_EventProvider.add_ELogEvent(__ClientFct_ELogEventEventHandler )
           à SURVENetClientFct.ClientFctClass.add_ELogEvent(__ClientFct_ELogEventEventHandler )
           à WindowsApplication1.Form1.Form1_Load(Object sender, EventArgs e) dans E:\Sample\Test_VbNet\TCPIP\Test_TCPIP\Test_TCPIP\Form1.vb:ligne 196
           à System.EventHandler.Invoke(Object sender, EventArgs e)
           à System.Windows.Forms.Form.OnLoad(EventArgs e)
           à System.Windows.Forms.Form.OnCreateControl()
           à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
           à System.Windows.Forms.Control.CreateControl()
           à System.Windows.Forms.Control.WmShowWindow(Message& m)
           à System.Windows.Forms.Control.WndProc(Message& m)
           à System.Windows.Forms.ScrollableControl.WndProc(Message& m)
           à System.Windows.Forms.ContainerControl.WndProc(Message& m)
           à System.Windows.Forms.Form.WmShowWindow(Message& m)
           à System.Windows.Forms.Form.WndProc(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
           à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
           à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
           à System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
           à System.Windows.Forms.Control.SetVisibleCore(Boolean value)
           à System.Windows.Forms.Form.SetVisibleCore(Boolean value)
           à System.Windows.Forms.Control.set_Visible(Boolean value)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
           à System.Windows.Forms.Application.Run(ApplicationContext context)
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
           à Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
           à WindowsApplication1.My.MyApplication.Main(String[] Args) dans 17d14f5c-a337-4978-8281-53493378c1071.vb:ligne 81
           à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()
      InnerException: 
    : 

    Je ne comprends absolument pas ce qui cloche... Quelqu'un peut-il m'aider ?

    Pour info, j'ai codé le même petit projet en Vb6... et tout fonctionne parfaitement, y compris bien sur les évènements.
    Mon erreur est donc bien une erreur de codage ou de déclaration dans VbNet.

    MERCI D'AVANCE POUR VOTRE AIDE !


    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    lundi 5 octobre 2009 10:51

Toutes les réponses

  • Bonjour,

    Il semblerait que votre composant : "SURVENetClientFct" souhaite ouvrir un fichier inexistant.
    Corrigez votre code dans le Form1_Load de votre fenêtre.

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    mardi 6 octobre 2009 21:18
    Modérateur
  • Bonjour,

    Malheureusement, mon composant "SURVENetClientFct" n'ouvre aucun fichier !!!
    C'est pourquoi je ne comprends absolument pas l'erreur "FileNotFoundException".

    Je vous rappelle je n'ai pas d'erreur quand la dll est utilisée par un projet Vb6.

    Utilisée à partir d'un projet VbNet, la dll fonctionne (transmission de données vers une adresse ip), mais les évènements ne sont pas utilisables (log divers, notification de changement de statut de socket, AR de chaque envoi, ...).

    Cela vous aiderait-il que je vous envoie ma dll ?

    Merci de votre aide
    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    mercredi 7 octobre 2009 09:59
  • Bonjour,

    Avez-vous essayé de déboguer afin de comprendre précisement où se trouve l'erreur ?

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    mercredi 7 octobre 2009 19:22
    Modérateur
  • Bonjour,

    Avez-vous essayé de déboguer afin de comprendre précisement où se trouve l'erreur ?

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur

    Bonjour,

    Voici le bilan de mes tests.
    Vous verrez que l'erreur dans le CONTEXTE N°1 est générée avant même le New du formulaire de démarrage,
    alors que l'erreur dans le CONTEXTE N°2 se produit sur une ligne en particulier.
    J'espère que ces descriptifs vous permettront de me venir en aide car je suis un peu perdu.

    CONTEXTE N°1

    Mon projet de test comporte un unique formulaire, dans lequel je déclare ma classe Vb6 ainsi:
    Public WithEvents clsClientFct As SURVENetClientFct.ClientFct = New SURVENetClientFct.ClientFct With { _
        .PFctBitParam = SURVENetClientFct.ClientFct_FctBitParam.Param16bits, _
        .PFctNbParam = SURVENetClientFct.ClientFct_FctNbParam.Param12, _
        .PClientFctFullAddress = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList(0).ToString, _
        .PRemotePort = 2500}
    J'utilise ensuite la méthode de la classe MSendAsync pour envoyer des données contenues dans le tableau uFctListe:
    clsClientFct.MSendAsync(uFctListe)
    EXECUTION: ça fonctionne très bien (les données sont bien reçues par le destinataire).

    Ensuite j'ouvre un évènement de la classe dans Vs2K8 ce qui me fait apparaitre dans le code la procedure (je le laisse vide):
        Private Sub clsClientFct_ELogEvent(ByVal strLogData As String) Handles clsClientFct.ELogEvent
    
        End Sub
    

    EXECUTION: J'ai l'erreur suivante : L'exception System.InvalidOperationException n'a pas été gérée
      Message="Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : Le fichier spécifié est introuvable. (Exception de HRESULT : 0x80070002)" (cf détail dans mon premier post de la file)

    Le cadre visual studio de l'erreur s'affiche au milieu de l'écran, sans pointer sur une ligne en particulier. J'ai mis en commentaire tout le code de ApplicationEvents.vb, et j'ai mis un point d'arrêt à la première ligne de la procédure New du formulaire de démarrage: L'erreur se produit avant que la procédure New ne s'exécute.

    Dans ce premier cas, je ne vois pas comment déboguer ???

    CONTEXTE N°2

    Comme le problème semble lié aux évènements de la classe, je déclare la classe Vb6 SANS WithEvents:
        Public clsClientFct As SURVENetClientFct.ClientFct = New SURVENetClientFct.ClientFct With { _
        .PFctBitParam = SURVENetClientFct.ClientFct_FctBitParam.Param16bits, _
        .PFctNbParam = SURVENetClientFct.ClientFct_FctNbParam.Param12, _
        .PClientFctFullAddress = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList(0).ToString, _
        .PRemotePort = 2500}
    

    EXECUTION: ça fonctionne très bien (les données sont bien reçues par le destinataire, comme précédemment).

    Ensuite je déclare un gestionnaire d'évènement dans le Form_Load:
            AddHandler clsClientFct.ELogEvent, AddressOf clsClientFct_ELogEvent
    

    ainsi que la procédure clsClientFct_ELogEvent (vide comme précédemment):
        Public Sub clsClientFct_ELogEvent(ByVal strLogData As String)
        End Sub
    

    EXECUTION: J'ai l'erreur suivante : L'exception System.IO.FileNotFoundException n'a pas été gérée
      Message="Le fichier spécifié est introuvable. (Exception de HRESULT : 0x80070002)" (cf détail dans mon premier post de la file)

    Cette fois-ci, le code a exécuté le New du formulaire, puis est entré dans le Form_Load: L'erreur se produit sur la ligne "AddHandler clsClientFct.ELogEvent, AddressOf clsClientFct_ELogEvent".

    Comme je ne vois pas l'erreur et que la fonction clsClientFct_ELogEvent est laissée vide, je ne sais pas comment déboguer d'avantage...???

    Pouvez-vous m'aider ?

    Merci.



    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    jeudi 8 octobre 2009 07:42