Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Note
Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.
El invalidOverlappedToPinvoke asistente de depuración administrada (MDA) se activa cuando se pasa un puntero superpuesto que no se creó en el montón de recolección de elementos no utilizados a funciones específicas de Win32.
Note
De forma predeterminada, este MDA solo se activa si la llamada de invocación de plataforma se define en el código y el depurador notifica el estado JustMyCode de cada método. Un depurador que no entiende JustMyCode (por ejemplo, MDbg.exe sin extensiones) no activará este MDA. Este MDA se puede habilitar para esos depuradores mediante un archivo de configuración y establecer justMyCode="false" explícitamente en el archivo (<invalidOverlappedToPinvoke enable="true" justMyCode="false"/>.mda.config ).
Síntomas
Bloqueos o daños en el montón que no se pueden explicar.
Causa
Un puntero superpuesto que no se creó en el montón de recolección de elementos no utilizados se pasa a funciones específicas del sistema operativo.
En la tabla siguiente se muestran las funciones que realiza este MDA.
| Módulo | 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 |
La posibilidad de daños en el montón es alta para esta condición porque la AppDomain realización de la llamada podría descargarse. Si descarga, AppDomain el código de la aplicación liberará la memoria del puntero superpuesto, lo que provocará daños cuando finalice la operación o el código perderá la memoria, lo que provocará dificultades más adelante.
Resolución
Use un Overlapped objeto , llamando al Pack método para obtener una NativeOverlapped estructura que se pueda pasar a la función. Si se AppDomain descarga, CLR espera hasta que se complete la operación asincrónica antes de liberar el puntero.
Efecto en el tiempo de ejecución
Este MDA no tuvo ningún efecto en el CLR.
Output
A continuación se muestra un ejemplo de salida de este 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.
Configuration
<mdaConfig>
<assistants>
<invalidOverlappedToPinvoke/>
</assistants>
</mdaConfig>