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 :

Exception sur deleguate


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut Exception sur deleguate
    Bonjour,
    Merci de m'aider.

    Comment corriger l'exception ci-dessous ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Managed Debugging Assistant 'CallbackOnCollectedDelegate' 
      Message=Managed Debugging Assistant 'CallbackOnCollectedDelegate' : 'Un rappel a été effectué sur un délégué récupéré par le garbage collector de type 'EglCube!EglCube.e3d+Tdelegate_callback_OnCapture::Invoke'. Cela peut entraîner un arrêt brutal de l'application, des dysfonctionnements et des pertes de données. Lors du passage de délégués à du code non managé, ils doivent être maintenus actifs par l'application managée jusqu'à ce qu'il soit garanti qu'ils ne seront jamais appelés.'

    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
     
            delegate int Tdelegate_callback_OnDraw3d(IntPtr param);
            delegate int Tdelegate_callback_OnCapture(IntPtr param, bool clicked,IntPtr v);
            static Tdelegate_e3d_Init delegate_e3d_Init;
     
            internal static int e3d_Init(byte[] vertexsource, byte[] fragmentsource, IntPtr param, Func<IntPtr,int> draw3d, Func<IntPtr,bool,pvect?,int> hint)
            {
                Tdelegate_callback_OnDraw3d ddraw3d = new Tdelegate_callback_OnDraw3d((o) =>
                {
                    return draw3d(o); //appel toujours code manager
                }
                );
     
     
                Tdelegate_callback_OnCapture dcapture = new Tdelegate_callback_OnCapture((o,a, b) =>
                {
                    pvect? v = null;
                    if (b!=IntPtr.Zero)
                        v=(pvect)Marshal.PtrToStructure(b, typeof(pvect));
                    return hint(o,a, v); //appel toujours code manager
                }
                );
     
                IntPtr ptrdraw3d = Marshal.GetFunctionPointerForDelegate(ddraw3d);
                IntPtr ptrhint = Marshal.GetFunctionPointerForDelegate(dcapture);
     
                return delegate_e3d_Init(vertexsource, fragmentsource, param, ptrdraw3d, ptrhint); //appel code non managé
            }
    J'appelle le code non manager 'delegate_e3d_Init' mais ca n'a rien a voir

    Merci beaucoup.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Je pense que la bonne syntaxe pour créer un delegate avec une expression lambda est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Tdelegate_callback_OnDraw3d = delegate (IntPtr param)
    {
        return draw3d(o); //appel toujours code manager
    }
    La doc sur les délégués :
    https://docs.microsoft.com/fr-fr/dot...sing-delegates
    https://docs.microsoft.com/fr-fr/dot...egates-lambdas

  3. #3
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Voici ce que je comprends de la situation : tu crées en code managé un delegate qui sera ensuite appelé dans du code non-managé. Le problème c'est que le Garbage Collector n'a aucune manière de savoir que le delegate en question est référencé par du code non-managé et il peut n'importe-quand décider de le collecter, celui-ci ne sera plus disponible au moment où il sera appelé, d'où ton exception CallbackOnCollectedDelegate. Pour parer à cela il faut que ton code managé garde une référence à ton delegate au moins jusqu'au moment où il ne sera plus utilisé par le code non-managé. L'erreur s'est produite sur le delegate Tdelegate_callback_OnCapture mais elle risque aussi de se produire sur le Tdelegate_callback_OnDraw3d. Pour le Tdelegate_e3d_Init tu as bien une référence managée, mais je ne vois pas où tu l'enregistre dans du code non-managé.

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut
    Pour parer à cela il faut que ton code managé garde une référence à ton delegate au moins jusqu'au moment où il ne sera plus utilisé par le code non-managé.
    OK mais comment le garder une référence à mon delegate ?

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Citation Envoyé par yann458 Voir le message
    OK mais comment le garder une référence à mon delegate ?
    Tout simplement en l'affectant à une variable dont la durée de vie est plus importante que celle du code non managé.

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/12/2005, 10h54
  2. Réponses: 5
    Dernier message: 07/07/2005, 10h20
  3. [vb.net] exception sur monForm.Show
    Par graphicsxp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/07/2005, 12h27
  4. Exception sur Java Web Start
    Par Le Bressan dans le forum JWS
    Réponses: 5
    Dernier message: 01/02/2005, 10h52
  5. [Tomcat] Exception sur JSP
    Par Malaussene dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 10/09/2004, 08h43

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