InvalidOverlappedToPInvoke
Der InvalidOverlappedToPInvoke-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn ein überlappender Zeiger, der nicht auf dem GC-Heap erstellt wurde, an spezifische Win32-Funktionen übergeben wird.
Hinweis |
|---|
| Dieser MDA wird standardmäßig nur aktiviert, wenn der Plattformaufruf im Code definiert wurde und der Debugger den JustMyCode-Status der einzelnen Methoden anzeigt (siehe Gewusst wie: Einzelschritte in "Nur mein Code"). Dieser MDA wird von Debuggern, die JustMyCode nicht interpretieren können (z. B. MDbg.exe ohne Erweiterungen) nicht aktiviert. Dieser MDA kann für diese Debugger mithilfe einer Konfigurationsdatei aktiviert werden, indem justMyCode="false" in der Datei .mda.config explizit festgelegt wird: (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>. |
Ein überlappender Zeiger, der nicht auf dem GC-Heap erstellt wurde, wird an spezifische Funktionen des Betriebssystems übergeben.
In der folgenden Tabelle werden die Funktionen gezeigt, die von diesem MDA überwacht werden.
| Modul | Funktion |
|---|---|
| HttpApi.dll | HttpReceiveHttpRequest |
| IpHlpApi.dll | NotifyAddrChange |
| kernel32.dll | ReadFile |
| kernel32.dll | ReadFileEx |
| kernel32.dll | WriteFile |
| kernel32.dll | WriteFileEx |
| kernel32.dll | ReadDirectoryChangesW |
| kernel32.dll | PostQueuedCompletionStatus |
| MSWSock.dll | ConnectEx |
| WS2_32.dll | WSASend |
| WS2_32.dll | WSASendTo |
| WS2_32.dll | WSARecv |
| WS2_32.dll | WSARecvFrom |
| MQRT.dll | MQReceiveMessage |
Unter dieser Bedingung besteht eine hohe Wahrscheinlichkeit von Heapbeschädigungen, da die AppDomain, die den Aufruf durchführt, möglicherweise entladen wird. Falls die AppDomain entladen wird, gibt der Anwendungscode den Speicher für den überlappenden Zeiger frei, was beim Ende des Vorgangs zu Beschädigungen führt, oder der Code verursacht einen Speicherverlust, was später zu Schwierigkeiten führt.
Verwenden Sie ein Overlapped-Objekt mit einem Aufruf der Pack-Methode, um eine NativeOverlapped-Struktur abzurufen, die an die Funktion übergeben werden kann. Wenn die AppDomain entladen wird, wartet die CLR auf den Abschluss des asynchronen Vorgangs, bevor der Zeiger freigegeben wird.
Im Folgenden finden Sie ein Beispiel für die Ausgabe dieses MDA.
An overlapped pointer (0x00ea3430) that was not allocated on the GC heap was passed via Pinvoke to the Win32 function 'WriteFile' in module 'KERNEL32.DLL'. If the AppDomain is shut down, this can cause heap corruption when the async I/O completes. The best solution is to pass a NativeOverlapped structure retrieved from a call to System.Threading.Overlapped.Pack(). If the AppDomain exits, the CLR will keep this structure alive and pinned until the I/O completes.
Hinweis