Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Note
Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.
Den invalidOverlappedToPinvoke hanterade felsökningsassistenten (MDA) aktiveras när en överlappande pekare som inte har skapats på skräpinsamlingens heap skickas till specifika Win32-funktioner.
Note
Som standard aktiveras denna MDA endast om plattformsanropet definieras i koden och felsökaren rapporterar JustMyCode-status för varje metod. Ett felsökningsprogram som inte förstår JustMyCode (till exempel MDbg.exe utan tillägg) aktiverar inte denna MDA. Denna MDA kan aktiveras för dessa felsökare med hjälp av en konfigurationsfil och explicit ställa in justMyCode="false" i filen .mda.config (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>).
Symptoms
Krascher eller oförklarliga heap-skador.
Orsak
En överlappande pekare som inte skapades på skräpinsamlingshögen skickas till specifika operativsystemfunktioner.
I följande tabell visas de funktioner som denna MDA spårar.
| Module | Function |
|---|---|
| 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 |
Risken för att heapen skadas är hög för det här villkoret eftersom anropet AppDomain kan ta bort. Om åtgärden AppDomain tas bort frigör programkoden antingen minnet för den överlappande pekaren, vilket orsakar skada när åtgärden är klar, eller så läcker koden minnet, vilket orsakar problem senare.
Upplösning
Använd ett Overlapped objekt och anropa Pack metoden för att hämta en NativeOverlapped struktur som kan skickas till funktionen. Om den AppDomain tar bort väntar CLR tills den asynkrona åtgärden har slutförts innan pekaren frigörs.
Effekt på körningen
Denna MDA hade ingen effekt på CLR.
Resultat
Följande är ett exempel på utdata från denna 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.
Konfiguration
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>