J'écris cette bibliothèque qui implémente certaines fonctionnalités de base du lecteur audio en C++/CLI via le framework Media Foundation qui sera consommé par le code managé. Je peux jouer de l'audio, arrêter, mettre en pause, etc. Pour tous ceux qui ne connaissent pas Media Foundation, la session média publie des événements que vous pouvez gérer pour les notifications. Cela est effectué en appelant BeginGetEvent sur l'objet de session avec un objet IMFAsyncCallback. Le IMFAsyncCallback définit la méthode Invoke (IMFAsyncResult) que vous devez implémenter pour gérer les événements. Lorsqu'un événement se produit, la méthode invoke est appelée par l'objet session sur un thread de travail avec un objet IMFAsyncResult que vous pouvez interroger pour les informations sur l'événement. Cet objet résultat est créé et appartenant au thread d'événement.System.AccessViolationException du code non managé?
Dans mon implémentation de Invoke, chaque fois que j'essaie de faire quoi que ce soit (y compris l'appel de QueryInterface ou quelque chose) avec l'objet IMFAsyncResult que je suis passé, j'obtiens une System.AccessViolationException. L'objet que j'implémente IMFAsyncCallback est une classe C++ de base (non gérée) allouée sur le tas CRT et les événements sont postés sur un thread appartenant à l'objet session également affecté au tas CRT.
Quelle pourrait être la cause de cette exception? Pourquoi est-ce que j'obtiens une exception gérée .NET à partir du code qui est implémenté dans le vieux C++? Est-ce exactement ce qui se passe quand vous avez un assemblage en mode mixte?