J'ai une application de service Windows C# qui transmet un pointeur de fonction de rappel à une DLL C++. J'ai défini à la fois le pointeur de fonction du côté C# et le côté C++ du type __stdcall. Tout fonctionne correctement jusqu'à ce que le rappel soit déclenché par la DLL C++ et lève une violation d'accès d'exception non gérée dans 0x04cb0e. Le débogage s'arrête dans le threadex.c sous l'appel endthread dans l'application C#.C# fournissant des rappels C++, Violation d'accès dans _threadex.c dans endthread()
public delegate void NotificationFunc(int notifycode, IntPtr Userdata);
[DllImport("notice.dll")]
void INotify(NotificationFunc notefunc,IntPtr Userdata);//ignore the IntPtr Userdata
.
.
.
NotificationFunc notefunc = new NotificationFunc(Noticallback);
INotify(notefunc, Intptr.zero);
//notice.dll triggers this callback thru the delegate passed in
void Noticallback(int notifycode, IntPtr userdata)
{
Swtich(notifycode)
{
//my actions
}
.
.//Error Exceptions happens here when trying to end the thread/call
}
Je sais que je dois gérer le nettoyage de ces ressources de rappel car il s'agit d'un événement d'appel à sens unique. J'ai essayé GC & GCHandle pour l'empêcher d'être GC mais il semble qu'il y ait toujours une fuite ou une erreur de mémoire. Peut-on aider quelqu'un? Merci
Entreposez-vous le rappel dans une variable locale? Le GC est libre de collecter des variables locales dès qu'il atteint un point où le code ne semble plus le référencer, il est donc possible que votre délégué soit collecté plus tôt qu'il ne semble l'être. En outre, pouvez-vous inclure le code du site d'appel C++ afin que nous puissions voir comment il est appelé et quelle est la signature C++? –