Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Note
Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, tra cui .NET 6 e versioni successive.
L'assistente invalidOverlappedToPinvoke al debug gestito viene attivato quando un puntatore sovrapposto non creato nell'heap di Garbage Collection viene passato a funzioni Win32 specifiche.
Note
Per impostazione predefinita, questo assistente al debug gestito viene attivato solo se la chiamata platform invoke è definita nel codice e il debugger segnala lo stato JustMyCode di ogni metodo. Un debugger che non riconosce JustMyCode (ad esempio MDbg.exe senza estensioni) non attiverà questo assistente al debug gestito. Questo assistente al debug gestito può essere abilitato per tali debugger usando un file di configurazione e impostando justMyCode="false" in modo esplicito nel file (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config .
Symptoms
Arresti anomali o danneggiamenti dell'heap inspiegabili.
Cause
Un puntatore sovrapposto che non è stato creato nell'heap di Garbage Collection viene passato a funzioni specifiche del sistema operativo.
La tabella seguente illustra le funzioni tracciate da questo assistente al debug gestito.
| Modulo | 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 |
Il rischio di danneggiamento dell'heap è elevato per questa condizione perché l'esecuzione AppDomain della chiamata potrebbe essere scaricata. Se l'operazione AppDomain viene scaricata, il codice dell'applicazione libera la memoria per il puntatore sovrapposto, causando danneggiamento al termine dell'operazione oppure il codice perderà la memoria, causando difficoltà in un secondo momento.
Risoluzione
Usare un Overlapped oggetto , chiamando il Pack metodo per ottenere una NativeOverlapped struttura che può essere passata alla funzione . Se l'oggetto AppDomain viene scaricato, CLR attende il completamento dell'operazione asincrona prima di liberare il puntatore.
Effetto sul runtime
Questo assistente al debug gestito non ha avuto alcun effetto su CLR.
Risultato
Di seguito è riportato un esempio di output di questo assistente al debug gestito.
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.
Configuration
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>