J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur mon
code pour m'envoyer des notifications, j'ai essayé avec de l'interop et une
fonction callback, cela fonctionne un certain temps, puis je ne reçoit plus
de notifications, je suppose que cela vient de la gestion mémoire du code
managé qui rend l'adresse de la fonction callback obsolète.
Est-il possible en C# de déclarer une classe en code non managé (comme en
C++)?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Paul Bacelar
Une fois JITé, le code managé est comme un code natif, le code n'est pas garbage-collecté ni compacté. Vérifiez avec un programme de test non-managé (en VC++ par exemple) que cela vient bien de C#, moi j'en doute. Vérifiez avec du C++CLI ou C++ managé si vous voulez. En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-). -- Paul Bacelar MVP VC++
"Jmb" wrote in message news:
Bonjour,
J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur mon code pour m'envoyer des notifications, j'ai essayé avec de l'interop et une fonction callback, cela fonctionne un certain temps, puis je ne reçoit plus de notifications, je suppose que cela vient de la gestion mémoire du code managé qui rend l'adresse de la fonction callback obsolète.
Est-il possible en C# de déclarer une classe en code non managé (comme en C++)?
Merci.
Une fois JITé, le code managé est comme un code natif, le code n'est pas
garbage-collecté ni compacté.
Vérifiez avec un programme de test non-managé (en VC++ par exemple) que cela
vient bien de C#, moi j'en doute.
Vérifiez avec du C++CLI ou C++ managé si vous voulez.
En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-).
--
Paul Bacelar
MVP VC++
"Jmb" <Jmb@discussions.microsoft.com> wrote in message
news:DCDD3B70-6CCA-492F-BBCF-98AF9ECB3B82@microsoft.com...
Bonjour,
J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur mon
code pour m'envoyer des notifications, j'ai essayé avec de l'interop et
une
fonction callback, cela fonctionne un certain temps, puis je ne reçoit
plus
de notifications, je suppose que cela vient de la gestion mémoire du code
managé qui rend l'adresse de la fonction callback obsolète.
Est-il possible en C# de déclarer une classe en code non managé (comme en
C++)?
Une fois JITé, le code managé est comme un code natif, le code n'est pas garbage-collecté ni compacté. Vérifiez avec un programme de test non-managé (en VC++ par exemple) que cela vient bien de C#, moi j'en doute. Vérifiez avec du C++CLI ou C++ managé si vous voulez. En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-). -- Paul Bacelar MVP VC++
"Jmb" wrote in message news:
Bonjour,
J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur mon code pour m'envoyer des notifications, j'ai essayé avec de l'interop et une fonction callback, cela fonctionne un certain temps, puis je ne reçoit plus de notifications, je suppose que cela vient de la gestion mémoire du code managé qui rend l'adresse de la fonction callback obsolète.
Est-il possible en C# de déclarer une classe en code non managé (comme en C++)?
Merci.
Jmb
Il semblerait que la déclaration du délégué ait une importance, si j'utilise une variable locale, je perd les notifications rapidement:
void Connect() { CallbackServerNotification callback = new CallbackServerNotification(OnNotification); bool ret = SetNotification(_handle,callback,IntPtr.Zero); if( ret=úlse ) throw new ApplicationException("SetNotification"); }
si j'utilise une variable membre de ma classe, les notifications ne s'arrêtent pas: void Connect() { _callback = new CallbackServerNotification(OnNotification); bool ret = SetNotification(_handle,_callback,IntPtr.Zero); if( ret=úlse ) throw new ApplicationException("SetNotification"); } CallbackServerNotification _callback;
Note : SetNotification est une méthode importée d'une DLL: bool _importcall SetNotification( HDatabase Database, TDatabaseNotification ACallback, void* AInstance); typedef void (__stdcall *TDatabaseNotification)(void* Instance, ServerNotification Notification, void* Params); typedef HandleStruct* HDatabase;
je pense que la variable locale est collectée et donc invalide.
"Paul Bacelar" a écrit :
Une fois JITé, le code managé est comme un code natif, le code n'est pas garbage-collecté ni compacté. Vérifiez avec un programme de test non-managé (en VC++ par exemple) que cela vient bien de C#, moi j'en doute. Vérifiez avec du C++CLI ou C++ managé si vous voulez. En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-). -- Paul Bacelar MVP VC++
"Jmb" wrote in message news: > Bonjour, > > J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur mon > code pour m'envoyer des notifications, j'ai essayé avec de l'interop et > une > fonction callback, cela fonctionne un certain temps, puis je ne reçoit > plus > de notifications, je suppose que cela vient de la gestion mémoire du code > managé qui rend l'adresse de la fonction callback obsolète. > > Est-il possible en C# de déclarer une classe en code non managé (comme en > C++)? > > Merci. >
Il semblerait que la déclaration du délégué ait une importance, si j'utilise
une variable locale, je perd les notifications rapidement:
void Connect()
{
CallbackServerNotification callback = new
CallbackServerNotification(OnNotification);
bool ret = SetNotification(_handle,callback,IntPtr.Zero);
if( ret=úlse )
throw new ApplicationException("SetNotification");
}
si j'utilise une variable membre de ma classe, les notifications ne
s'arrêtent pas:
void Connect()
{
_callback = new CallbackServerNotification(OnNotification);
bool ret = SetNotification(_handle,_callback,IntPtr.Zero);
if( ret=úlse )
throw new ApplicationException("SetNotification");
}
CallbackServerNotification _callback;
Note : SetNotification est une méthode importée d'une DLL:
bool _importcall SetNotification(
HDatabase Database,
TDatabaseNotification ACallback,
void* AInstance);
typedef void (__stdcall *TDatabaseNotification)(void* Instance,
ServerNotification Notification, void* Params);
typedef HandleStruct* HDatabase;
je pense que la variable locale est collectée et donc invalide.
"Paul Bacelar" a écrit :
Une fois JITé, le code managé est comme un code natif, le code n'est pas
garbage-collecté ni compacté.
Vérifiez avec un programme de test non-managé (en VC++ par exemple) que cela
vient bien de C#, moi j'en doute.
Vérifiez avec du C++CLI ou C++ managé si vous voulez.
En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-).
--
Paul Bacelar
MVP VC++
"Jmb" <Jmb@discussions.microsoft.com> wrote in message
news:DCDD3B70-6CCA-492F-BBCF-98AF9ECB3B82@microsoft.com...
> Bonjour,
>
> J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur mon
> code pour m'envoyer des notifications, j'ai essayé avec de l'interop et
> une
> fonction callback, cela fonctionne un certain temps, puis je ne reçoit
> plus
> de notifications, je suppose que cela vient de la gestion mémoire du code
> managé qui rend l'adresse de la fonction callback obsolète.
>
> Est-il possible en C# de déclarer une classe en code non managé (comme en
> C++)?
>
> Merci.
>
Il semblerait que la déclaration du délégué ait une importance, si j'utilise une variable locale, je perd les notifications rapidement:
void Connect() { CallbackServerNotification callback = new CallbackServerNotification(OnNotification); bool ret = SetNotification(_handle,callback,IntPtr.Zero); if( ret=úlse ) throw new ApplicationException("SetNotification"); }
si j'utilise une variable membre de ma classe, les notifications ne s'arrêtent pas: void Connect() { _callback = new CallbackServerNotification(OnNotification); bool ret = SetNotification(_handle,_callback,IntPtr.Zero); if( ret=úlse ) throw new ApplicationException("SetNotification"); } CallbackServerNotification _callback;
Note : SetNotification est une méthode importée d'une DLL: bool _importcall SetNotification( HDatabase Database, TDatabaseNotification ACallback, void* AInstance); typedef void (__stdcall *TDatabaseNotification)(void* Instance, ServerNotification Notification, void* Params); typedef HandleStruct* HDatabase;
je pense que la variable locale est collectée et donc invalide.
"Paul Bacelar" a écrit :
Une fois JITé, le code managé est comme un code natif, le code n'est pas garbage-collecté ni compacté. Vérifiez avec un programme de test non-managé (en VC++ par exemple) que cela vient bien de C#, moi j'en doute. Vérifiez avec du C++CLI ou C++ managé si vous voulez. En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-). -- Paul Bacelar MVP VC++
"Jmb" wrote in message news: > Bonjour, > > J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur mon > code pour m'envoyer des notifications, j'ai essayé avec de l'interop et > une > fonction callback, cela fonctionne un certain temps, puis je ne reçoit > plus > de notifications, je suppose que cela vient de la gestion mémoire du code > managé qui rend l'adresse de la fonction callback obsolète. > > Est-il possible en C# de déclarer une classe en code non managé (comme en > C++)? > > Merci. >
Paul Bacelar
Oups! j'ai un peu simplifié les choses : http://msdn.microsoft.com/msdnmag/issues/02/08/CQA/ -- Paul Bacelar MVP VC++
"Jmb" wrote in message news:
Il semblerait que la déclaration du délégué ait une importance, si j'utilise une variable locale, je perd les notifications rapidement:
void Connect() { CallbackServerNotification callback = new CallbackServerNotification(OnNotification); bool ret = SetNotification(_handle,callback,IntPtr.Zero); if( ret=úlse ) throw new ApplicationException("SetNotification"); }
si j'utilise une variable membre de ma classe, les notifications ne s'arrêtent pas: void Connect() { _callback = new CallbackServerNotification(OnNotification); bool ret = SetNotification(_handle,_callback,IntPtr.Zero); if( ret=úlse ) throw new ApplicationException("SetNotification"); } CallbackServerNotification _callback;
Note : SetNotification est une méthode importée d'une DLL: bool _importcall SetNotification( HDatabase Database, TDatabaseNotification ACallback, void* AInstance); typedef void (__stdcall *TDatabaseNotification)(void* Instance, ServerNotification Notification, void* Params); typedef HandleStruct* HDatabase;
je pense que la variable locale est collectée et donc invalide.
"Paul Bacelar" a écrit :
Une fois JITé, le code managé est comme un code natif, le code n'est pas garbage-collecté ni compacté. Vérifiez avec un programme de test non-managé (en VC++ par exemple) que cela vient bien de C#, moi j'en doute. Vérifiez avec du C++CLI ou C++ managé si vous voulez. En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-). -- Paul Bacelar MVP VC++
"Jmb" wrote in message news: > Bonjour, > > J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur > mon > code pour m'envoyer des notifications, j'ai essayé avec de l'interop et > une > fonction callback, cela fonctionne un certain temps, puis je ne reçoit > plus > de notifications, je suppose que cela vient de la gestion mémoire du > code > managé qui rend l'adresse de la fonction callback obsolète. > > Est-il possible en C# de déclarer une classe en code non managé (comme > en > C++)? > > Merci. >
Oups! j'ai un peu simplifié les choses :
http://msdn.microsoft.com/msdnmag/issues/02/08/CQA/
--
Paul Bacelar
MVP VC++
"Jmb" <Jmb@discussions.microsoft.com> wrote in message
news:02D72171-0EEF-4B0D-81C5-AF71D9775AFA@microsoft.com...
Il semblerait que la déclaration du délégué ait une importance, si
j'utilise
une variable locale, je perd les notifications rapidement:
void Connect()
{
CallbackServerNotification callback = new
CallbackServerNotification(OnNotification);
bool ret = SetNotification(_handle,callback,IntPtr.Zero);
if( ret=úlse )
throw new ApplicationException("SetNotification");
}
si j'utilise une variable membre de ma classe, les notifications ne
s'arrêtent pas:
void Connect()
{
_callback = new CallbackServerNotification(OnNotification);
bool ret = SetNotification(_handle,_callback,IntPtr.Zero);
if( ret=úlse )
throw new ApplicationException("SetNotification");
}
CallbackServerNotification _callback;
Note : SetNotification est une méthode importée d'une DLL:
bool _importcall SetNotification(
HDatabase Database,
TDatabaseNotification ACallback,
void* AInstance);
typedef void (__stdcall *TDatabaseNotification)(void* Instance,
ServerNotification Notification, void* Params);
typedef HandleStruct* HDatabase;
je pense que la variable locale est collectée et donc invalide.
"Paul Bacelar" a écrit :
Une fois JITé, le code managé est comme un code natif, le code n'est pas
garbage-collecté ni compacté.
Vérifiez avec un programme de test non-managé (en VC++ par exemple) que
cela
vient bien de C#, moi j'en doute.
Vérifiez avec du C++CLI ou C++ managé si vous voulez.
En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-).
--
Paul Bacelar
MVP VC++
"Jmb" <Jmb@discussions.microsoft.com> wrote in message
news:DCDD3B70-6CCA-492F-BBCF-98AF9ECB3B82@microsoft.com...
> Bonjour,
>
> J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur
> mon
> code pour m'envoyer des notifications, j'ai essayé avec de l'interop et
> une
> fonction callback, cela fonctionne un certain temps, puis je ne reçoit
> plus
> de notifications, je suppose que cela vient de la gestion mémoire du
> code
> managé qui rend l'adresse de la fonction callback obsolète.
>
> Est-il possible en C# de déclarer une classe en code non managé (comme
> en
> C++)?
>
> Merci.
>
Oups! j'ai un peu simplifié les choses : http://msdn.microsoft.com/msdnmag/issues/02/08/CQA/ -- Paul Bacelar MVP VC++
"Jmb" wrote in message news:
Il semblerait que la déclaration du délégué ait une importance, si j'utilise une variable locale, je perd les notifications rapidement:
void Connect() { CallbackServerNotification callback = new CallbackServerNotification(OnNotification); bool ret = SetNotification(_handle,callback,IntPtr.Zero); if( ret=úlse ) throw new ApplicationException("SetNotification"); }
si j'utilise une variable membre de ma classe, les notifications ne s'arrêtent pas: void Connect() { _callback = new CallbackServerNotification(OnNotification); bool ret = SetNotification(_handle,_callback,IntPtr.Zero); if( ret=úlse ) throw new ApplicationException("SetNotification"); } CallbackServerNotification _callback;
Note : SetNotification est une méthode importée d'une DLL: bool _importcall SetNotification( HDatabase Database, TDatabaseNotification ACallback, void* AInstance); typedef void (__stdcall *TDatabaseNotification)(void* Instance, ServerNotification Notification, void* Params); typedef HandleStruct* HDatabase;
je pense que la variable locale est collectée et donc invalide.
"Paul Bacelar" a écrit :
Une fois JITé, le code managé est comme un code natif, le code n'est pas garbage-collecté ni compacté. Vérifiez avec un programme de test non-managé (en VC++ par exemple) que cela vient bien de C#, moi j'en doute. Vérifiez avec du C++CLI ou C++ managé si vous voulez. En résumé, je pense que vous avez choisi le mauvais bouc émissaire ;-). -- Paul Bacelar MVP VC++
"Jmb" wrote in message news: > Bonjour, > > J'utilise une DLL externe qui a besoin d'un pointeur de fonction sur > mon > code pour m'envoyer des notifications, j'ai essayé avec de l'interop et > une > fonction callback, cela fonctionne un certain temps, puis je ne reçoit > plus > de notifications, je suppose que cela vient de la gestion mémoire du > code > managé qui rend l'adresse de la fonction callback obsolète. > > Est-il possible en C# de déclarer une classe en code non managé (comme > en > C++)? > > Merci. >