¿Es posible acceder a la variable "errno" en C# cuando P/Invoca? Esto es similar a Win32 GetLastError().Variable global de acceso C 'errno' de C#
Respuesta
Estoy bastante seguro de que hay una manera, pero probablemente sea una mala idea. ¿Cómo garantizaría que el tiempo de ejecución no ha llamado a alguna función CRT durante su procesamiento interno que ha afectado al errno
?
Por la misma razón, tampoco debe llamar directamente al GetLastError
. El DllImportAttribute
proporciona una propiedad SetLastError
, por lo que el tiempo de ejecución sabe capturar inmediatamente el último error y almacenarlo en un lugar que el código administrado pueda leer usando Marshal.GetLastWin32Error
.
Creo que lo más robusto que podría hacer en este caso es crear una DLL de C que realice tanto el trabajo C real como la captura del errno
. (Tenga en cuenta que simplemente escribir un contenedor alrededor de la captura errno
todavía tendría las preocupaciones mencionadas anteriormente.)
Sí, es posible - GetLastError
hace exactamente eso. Sin embargo, como señaló binarycoder, no debe hacer esto directamente; en su lugar, establezca SetLastError
en su DllImport
para realizar esto y almacenarlo en caché automáticamente (y para evitar problemas de subprocesos múltiples o funciones invocadas en tiempo de ejecución que modifican el valor errno
); luego, al invocar el P/Función invocada, verifique su estado de retorno, y si muestra una condición de error - tiro Win32Exception
, que lee el valor del último error automáticamente. Sí, incluso en Mono en Linux.
La solución es usar SetLastError
en DllImport
. Esto hará que el tiempo de ejecución guarde el último error para que se pueda acceder desde Marshal.GetLastWin32Error
.
Hay dos problemas con llamar directamente GetLastError
:
- El tiempo de ejecución podría hacerlo en algún momento después de la PInvoke regresa antes de que pueda conseguir el último error
- hilos .NET múltiples pueden residir en el mismo nativa hilo. Esto puede dar como resultado que 2 subprocesos .NET que hacen PInvokes, bibliotecas nativas que no conocen nada mejor, sobrescriban el último error. Entonces, el hilo A en .NET obtiene el último error del hilo B (potencialmente).
¿Puedes mostrar un ejemplo de la sintaxis para usar 'SetLastError' en' DllImport'? –
- 1. Estableciendo la variable global LUA_PATH de C++/C?
- 2. variable global V.S. variable de archivo en C++
- 3. acceso variable concurrente en c
- 4. Objetivo C: variable estática y global?
- 5. C tenedor frente a la variable global
- 6. Confundiendo problemas de alcance global de C++
- 7. ¿Cómo uso errno en C++
- 8. ¿Cómo acceder a una variable global de Python desde C?
- 9. Variable global compartida en la biblioteca estática de C++
- 10. acceso variable global desde dentro de una clase
- 11. aplicación Variable global
- 12. ¿Cómo obtener acceso global a tipos enum en C#?
- 13. Acceso global en Java
- 14. ¿Cuándo está bien usar una variable global en C?
- 15. Clases de Python de variable global
- 16. C++ miembro función de acceso privado variable estática?
- 17. C# Project Global AssemblyInfo
- 18. C++ variable estática
- 19. C++ objeto global
- 20. qué significa global :: C#
- 21. Problema con el acceso a una variable global en PHP
- 22. C global estático - compartido entre hilos?
- 23. C & C++ predeterminado vinculación variable global, múltiples declaración y definición del problema
- 24. Acceso valor de la variable usando cadena que representa el nombre de variable en C++
- 25. C declaración de variable
- 26. C# Nombre de variable
- 27. Zend, variable global en Application.ini?
- 28. Mantener una variable global o recrear una variable local en c?
- 29. Acceso aleatorio CSV; C#
- 30. instancia global de una clase en C++
Sí, estoy de acuerdo con esto. Probablemente sería mejor configurar un contenedor C como una función objetivo que a su vez devolvería el valor de errno. – supercheetah