System.AccessViolationException vom nicht verwalteten Code?

Ich schreibe diese Bibliothek, die einige grundlegende Audio-Player-Funktionen in C ++ / CLI über das Media Foundation-Framework implementiert, die von verwaltetem Code verwendet werden. Ich kann Audio abspielen, anhalten, pausieren usw. ganz gut. Für alle, die mit Media Foundation nicht vertraut sind, werden in der Mediensitzung Ereignisse veröffentlicht, die Sie für Benachrichtigungen verarbeiten können. Dies erfolgt durch Aufrufen von BeginGetEvent für das Sitzungsobjekt mit einem IMFAsyncCallback-Objekt. Der IMFAsyncCallback definiert die Methode Invoke (IMFAsyncResult), die Sie implementieren sollten, um die Ereignisse zu behandeln. Wenn ein Ereignis eintritt, wird die Aufrufmethode vom Sitzungsobjekt in einem Arbeitsthread mit einem IMFAsyncResult-Objekt aufgerufen, das Sie nach den Ereignisinformationen abfragen können. Dieses Ergebnisobjekt wird erstellt und gehört dem Ereignisthread.

Bei meiner Implementierung von Invoke erhalte ich immer dann eine System.AccessViolationException, wenn ich versuche, mit dem übergebenen IMFAsyncResult-Objekt etwas zu tun (z. B. nur QueryInterface aufzurufen). Das Objekt, das IMFAsyncCallback implementiert, ist eine grundlegende C ++ - Klasse (nicht verwaltet), die auf dem CRT-Heap zugeordnet ist, und die Ereignisse werden in einem Thread abgelegt, der dem Sitzungsobjekt gehört, das auch auf dem CRT-Heap zugeordnet ist.

Was könnte diese Ausnahme verursachen?

Warum erhalte ich eine von .NET verwaltete Ausnahme, die von Code ausgelöst wird, der in einfachem altem C ++ implementiert ist? Ist das genau das, was passiert, wenn Sie eine Assembly im gemischten Modus haben?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage