Tuesday, 3 October 2017

Marshal Gethrforexception E


Descubro que a veces en operaciones IO se dispara IOException común. Puedo utilizar el método de Marshal. GetHRForException (excepción e) (encontrado aquí) para determinar el código de error específico. Después de eso, quiero volver a lanzar una excepción, utilizando mi aplicación código de error específico, con el fin de dar al usuario algunos consejos de lo que ha ido mal. Pero no pude encontrar la lista de posibles valores HResult para IOException. Una cosa más que estoy atascado es que para los diferentes códigos HResult causa raíz puede ser el mismo - por ejemplo, 0x8007052E y 0x80070569 - ambos corresponden a error de inicio de sesión: nombre de usuario desconocido o contraseña incorrecta. He intentado buscar algo como valores de IOException HResult pero no había nada especial para cartografiar IOException HResult con error legible humano (como esto o esto). También he visto la pregunta aquí, que es muy similar, pero todavía no hay solución. Por lo tanto, donde está la documentación acerca de los valores de IOException HResults Utilizando Marshal. GetHRForException () envolvió el código de error de Windows en un código de error HResult. Para una IOException siempre será el número de error de Windows 0x80070000. El 8 significa error, el 7 significa que vino de Windows. Podría simplemente utilizar amp 0xffff para recuperar el código de error original de nuevo. Convierta el resultado de nuevo en decimal y tendrá muchos lugares para averiguar qué significa el código de error. Personalmente, siempre utilizo el archivo de encabezado WinError. h SDK. Depende de la versión de VS que tenga, la mayoría de los programadores lo encontrarán de nuevo en el directorio de Microsoft SDKsWindowsv7.1AInclude de los archivos de programa (x86). También tiene una práctica utilidad disponible, ejecute errlook. exe desde el indicador de comandos de Visual Studio. Una buena manera de tenerlo fácilmente disponible es añadiéndolo al menú Herramientas. Herramientas de uso Herramientas externas, botón de adición, búsqueda del título de error, comando C: Archivos de programa (x86) Microsoft Visual Studio 12.0Common7Toolserrlook. exe. Ajusta la ruta según sea necesario para que coincida con tu versión de VS. Ahora también encontrará que los códigos de error no son los mismos. 0x80070569 amp 0xffff 0x569 1385. Buscando WinError. h para ese código de error produce ERRORLOGONTYPENOTGRANTED, error de inicio de sesión: el usuario no se ha concedido el tipo de inicio de sesión solicitado en este equipo. El tipo de errores de IOException que puede obtener no están restringidos de ninguna manera. Windows no tiene especificaciones de excepción, sólo los códigos de error más comunes se enumeran en la documentación de MSDN para una función winapi en particular. Al igual que las excepciones. NET. Un mal necesario, muchos códigos de error de IOException se generan por controladores que no fueron escritos por Microsoft. Respondió Sep 9 14 at 8: 57Tengo un código IO que lee un flujo dentro de un try..catch. Coge IOException y llama a System. Runtime. InteropServices. Marshal. GetHRForException () dentro de la captura, en un intento de tomar diferentes acciones basadas en el HResult. Algo como esto: Pero ejecutando este código dentro de ASP. NET con trustmedium, recibo esta excepción: Un par de preguntas: Creo que la excepción se produce porque GetHRForException llama a código no administrado, que no está permitido en confianza media. Correct Esta excepción se está lanzando, no en el momento de la ejecución de GetHRForException, pero en el momento en que el método está siendo JITed - Correct (El stacktrace muestra mi método, pero estoy seguro de que no ha ocurrido una excepción IO) ¿Hay una manera para mí para variar el comportamiento en un entorno de confianza parcial, por lo que no llamar a la GetHRForException (código no administrado) donde no está permitido En otras palabras, ¿cómo puedo permitir que el JIT tenga éxito en la compilación, mientras que también Evaluando en tiempo de ejecución si el código debe llamar a GetHRForException () Algo como esto: Creo que hay un mecanismo de tiempo de ejecución para probar si los permisos están disponibles, pero havent sido capaz de encontrarlo. EDITAR. ¿Es este artículo del blog la respuesta ShawnFa de Microsoft dice que usted no puede hacer una prueba. Catch (SecurityException) alrededor de un método protegido por un LinkDemand. Si MethodA () llama a MethodB () y MethodB () está marcado con LinkDemand para confianza completa, a continuación, el LinkDemand está marcado con MethodA es Jited. Por lo tanto, para evitar la excepción de seguridad, necesito extraer Marshal. GetHRForException en un método separado. ¿Es eso correcto? Aplicada a mi código, MethodA () puede ser el código que llama a Read, y luego en la captura intenta llamar a GetHRForException (). GetHRForException es MethodB (). El LinkDemand se evalúa cuando MethodA () es JITd. (Este LinkDemand falla en mi escenario de ASP. NET de confianza media). Si muevo la GetHRForException en un nuevo método, MethodC (), y condicionalmente llamar a MethodC () sólo después de un imperativo permission. Demand () tiene éxito, teóricamente debería ser capaz de evitar el SecurityException en JIT tiempo, porque MethodC () será JITd sólo después de que el permiso. Demain () tenga éxito. Pregunta Jul 12 09 at 14:20 El método requerido es SecurityPermission. IsUnrestricted (). Devuelve un verdadero o un falso indicando si el permiso está permitido o no. No requiere un permiso, al igual que SecurityPermission. Demand (). Yo uso IsUnresticted con SecurityPermissionFlag. UnmanagedCode para ver si el ensamblado se le permite llamar código no administrado y, a continuación, llame al código no administrado sólo si se permite. Hay un giro adicional. El compilador JIT, al compilar un método, comprueba la existencia de CodeAccessPermission LinkDemands en cualquier método llamado my el método que se va a compilar. Marshal. GetHRForException () está marcado con una LinkDemand. Por lo tanto, mi método que llama a Marshal. GetHRForException () lanzará una excepción de seguridad uncatchable en el momento de compilar JIT, cuando se ejecuta en un entorno restringido, como ASP. NET con confianza media. Por lo tanto, nunca debemos JIT el método que llama a Marshal. GetHRForException () en ese caso, lo que significa que necesito romper Marshal. GetHRForException () en un método separado en mi código que se llama (y así JITted) sólo cuando UnmanagedCode es irrestricto. He aquí algunos ejemplos de código: respondió Jul 20 09 at 17:56 Yes - medium trust no permitirá llamadas en código no administrado. El único nivel de confianza que lo permite es la plena confianza. Depende. Las demandas de CAS pueden tener lugar en tiempo de ejecución, pero el entorno de alojamiento también puede ir de un paseo y buscar cosas que no puede hacer. Puede probar para ver si puede realizar una llamada a código no administrado utilizando una solicitud CAS con una instancia de SecurityPermission. El código para hacer una demanda de CAS se parece a esto respondió Jul 12 09 at 14:32 OK, esta es una gran información. Esto cubre la parte b de Q3. ¿Pero qué sobre la parte a cómo consigo el JIT compilar para tener éxito puedo marcar mi método con un atributo de seguridad o. Recuerde, mi teoría es que el error de SecurityPermission no está sucediendo en tiempo de ejecución, está sucediendo durante JIT - y creo que usted confirmó que esto es posible. Así que la pregunta es, ¿cómo escribo el código para permitir que el JIT compile. Ndash Cheeso Jul 12 09 at 15:50 Debería estar ocurriendo en tiempo de ejecución, de lo contrario no se cargaría el montaje - y para que eso suceda, el ensamblaje necesita ser marcado como requiriendo el permiso. Incluso entonces eso es discutible una comprobación del tiempo de ejecución, como sucederá en la carga de la asamblea, que podría estar en la época de la ejecución. Ndash blowdart Jul 12 09 at 16:24 Diferentes tipos de comprobación, las demandas de enlaces son atributos en un método, y de hecho se comprueban a tiempo JIT. Es prácticamente utilizado por el propio marco y es raro verlo fuera de la fuente CLR. Lo que demuestro es una demanda imperativa, no declarativa como un SecurityPermission (SecurityAction. LinkDemand, Unrestricted true) ndash blowdart Jul 12 09 at 18: 55La posibilidad de que una excepción se propague fuera del método produce un comportamiento incorrecto. (De hecho, el tiempo de ejecución de lenguaje común no logra pasar a una excepción a un cliente COM llamar a un procedimiento de este tipo a través de una tabla v.) Puesto que he eliminado todos los atributos PreserveSig de todos mis métodos de interfaz y ha pasado totalmente a una excepción de base Enfoque para mi biblioteca, esto sería malo. En mis objetos COM, utilizo quotthrowquot todo el tiempo para devolver errores a la persona que llama (ambos administrados y no administrados) y yo todavía no han visto un problema. Lanzar una COMException, y el HRESULT termina en la llamada hr. Lo que es más, el cliente (no administrado) puede recuperar la interfaz IErrorInfo para recibir el texto que lanzar junto con el código de error. Son estos antiguos documentos que havent sido actualizadas para reflejar el comportamiento actual Quizá Im malentendido lo que está tratando de decirme O hay alguna Gotcha horrible, esperando a morder en el, umm, viernes por el futuro, 20 de julio de, de 2007 a las 2:44 Respuestas De acuerdo , Podría haber exagerado el quotsinquot bit aquí. Me centré demasiado en dejar escapar las excepciones C de la llamada al método COM. Lo que en verdad fue un pecado en los días no manejados, hace mucho tiempo para mí. El hecho de que funciona es una prueba bastante convincente de que el contenedor CCW captura COMException y genera el valor de retorno HRESULT. Es probablemente más grande que eso, Id imagina que coge Exception y llama a Marshal. GetHRForException método automáticamente. Tendría que, theres ninguna manera que un cliente de COM podría coger una excepción manejada. Id decir que eres bueno para ir, lo siento por la confusión. La documentación podría ser un poco más estricta aquí. Sábado, 21 de julio de 2007 21:27 Todas las respuestas Sí, estás cometiendo un pecado grave. Está esperando que el cliente COM capture la excepción administrada. Eso va a fallar miserablemente cuando el cliente no es una aplicación administrada y terminará el cliente. COMException es sólo para su uso por el tiempo de ejecución. Debe devolver errores a través del valor devuelto HRESULT. A su vez, suelen generar excepciones en el cliente (como COMException en una aplicación administrada). Estoy sorprendido de su enfoque funciona en absoluto. Algunos clientes COM instalar un controlador de excepciones a las excepciones SEH trampa asíncronos (división por cero, desbordamiento de pila, de acceso a memoria no válida, cosas por el estilo). Tal vez funciona porque ese controlador intercepta la COMException. Pero eso es un detalle de implementación del cliente. Los clientes de C para uno casi nunca hacen esto. Sábado por la, 21 de de julio de, de 2007 18:28 throw new COMException (quotRemoving no corrientes de supportedquot. ENotImplemented) El HRESULT que recibo de la llamada c es ENOTIMPL, tal y como era de esperar. Yo he ido a través de la configuración c, y se encontró exceptionsquot quotEnable C y configurarlo para que se quotNo. quot Sin embargo, acabo de volver a la AR que esperaba. No vi nada más que se aplicaría. Y no, no estoy compilando el programa c con soporte de clr. De hecho, aquí está el contenido de la ventana quotcommand linequot: / Od / D quotWIN32quot / D quotDEBUGquot / D quotCONSOLEquot / D quotUNICODEquot / D quotUNICODEquot / Gm / RTC1 / MDD / FoquotDebugquot /FdquotDebugvc80.pdbquot / W3 / nologo / c / Wp64 / ZI / TP / errorReport: prompt Sólo las opciones básicas de compilación. Estoy corriendo en Vista, pero no parece que debería importar. Tal vez esto es algo que ha cambiado con el tiempo o hay alguna otra opción c compilación que se suponía que apague bien, podría haber exagerado el bit quotsinquot aquí. Me centré demasiado en dejar escapar las excepciones C de la llamada al método COM. Lo que en verdad fue un pecado en los días no manejados, hace mucho tiempo para mí. El hecho de que funciona es una prueba bastante convincente de que el contenedor CCW captura COMException y genera el valor de retorno HRESULT. Es probablemente más grande que eso, Id imagina que coge Exception y llama a Marshal. GetHRForException método automáticamente. Tendría que, theres ninguna manera que un cliente de COM podría coger una excepción manejada. Id decir que eres bueno para ir, lo siento por la confusión. La documentación podría ser un poco más estricta aquí. Sábado, 21 de julio de 2007 21:27 Ok, estaba preocupado. Había sacado cientos de líneas de CÓDIGO SUCCEEDEDQuot y eliminado PreserveSig de cientos de métodos. Tener que poner todo eso fue. Desalentador Gracias por dejarme correr este pasado. Sábado, 21 de julio de 2007 21:50 Microsoft está realizando una encuesta en línea para comprender su opinión sobre el sitio Web Msdn. Si decide participar, se le presentará la encuesta en línea cuando abandone el sitio Web de Msdn. Te gustaría participar

No comments:

Post a Comment