Marshal Gethrforexception Ex




Marshal Gethrforexception ExEu tenho algum codigo IO que le um fluxo dentro de um try..catch. Ele captura IOException e chama System. Runtime. InteropServices. Marshal. GetHRForException () dentro da captura, na tentativa de tomar diferentes acoes com base no HResult. Algo como isto: mas executando este codigo no ASP com confianca, recebo esta excecao: algumas questoes: acho que a excecao esta ocorrendo porque o GetHRForException chama o codigo nao gerenciado, o que nao e permitido em confianca media. Corrigir Esta excecao esta sendo lancada, nao no momento da execucao do GetHRForException, mas no momento em que o metodo esta sendo JITADO - Corrigido (O stacktrace mostra meu metodo, mas eu tenho 99 certeza de que uma excecao de IO nao ocorreu) Se assim for, Existe uma maneira para eu variar o comportamento em um ambiente de confianca parcial, para que eu nao ligue para o GetHRForException (codigo nao gerenciado), onde nao e permitido. Em outras palavras, como posso permitir que o JIT tenha sucesso no tempo de compilacao, enquanto tambem Avaliando em tempo de execucao se o codigo deve chamar GetHRForException () Algo como isto: acho que existe um mecanismo de tempo de execucao para testar se as permissoes estao disponiveis, mas nao conseguiu encontra-lo. EDITAR. Este artigo de blog e a resposta ShawnFa da Microsoft diz que voce nao pode fazer uma tentativa. Pegar (SecurityException) em torno de um metodo protegido por um LinkDemand. Se MethodA () chama MethodB () e MethodB () estiver marcado com LinkDemand para confianca total, o LinkDemand e verificado com MethodA is Jited. Portanto, para evitar o SecurityException, preciso extrair Marshal. GetHRForException para um metodo separado. Isso e correto Aplicado ao meu codigo, MethodA () pode ser o codigo que chama Read e, em seguida, na tentativa tenta chamar GetHRForException (). GetHRForException e MethodB (). O LinkDemand e avaliado quando MethodA () e JITd. (Este LinkDemand falha no meu cenario ASP de confianca media). Se eu mover o GetHRForException para um novo metodo, MethodC (), e condicionalmente chamar MethodC () somente depois que uma permissao imperativa. Dandand () for bem-sucedido, teoricamente, eu poderia ser capaz de evitar o SecurityException no JIT, porque MethodC () sera JITd somente apos a permissao. Demain () e bem-sucedido. Perguntou Jul 12 09 as 14:20 O metodo requerido e SecurityPermission. IsUrestrito (). Retorna um verdadeiro ou falso indicando se a permissao e permitida ou nao. Nao exige uma permissao, assim como SecurityPermission. Demand (). Eu uso IsUnresticted com SecurityPermissionFlag. UnmanagedCode para ver se o assembly pode chamar o codigo nao gerenciado e, em seguida, chamar o codigo nao gerenciado somente se permitido. Ha um toque adicional. O compilador JIT, ao compilar um metodo, verifica CodeAccessPermission LinkDemands em qualquer metodo chamado meu metodo para ser compilado. Marshal. GetHRForException () e marcado com um LinkDemand. Por isso, o meu metodo que chama Marshal. GetHRForException () lancara uma SecurityException incompetavel no momento da compilacao JIT, quando executada em um ambiente restrito, como ASP com confianca media. Portanto, nunca devemos JIT o metodo que chama Marshal. GetHRForException () nesse caso, o que significa que eu preciso romper Marshal. GetHRForException () em um metodo separado no meu codigo que e chamado (e, portanto, JITted) somente quando UnmanagedCode e Sem restricoes. Heres algum codigo de exemplo: respondeu Jul 20 09 as 17:56 Sim - confianca media nao permitira chamadas em codigo nao gerenciado. O unico nivel de confianca que o permite e confianca total. Depende. As demandas de CAS podem ocorrer no tempo de execucao, mas o ambiente de hospedagem tambem pode andar e procurar coisas que nao pode fazer. Voce pode testar para ver se voce pode fazer uma chamada para codigo nao gerenciado usando uma demanda de CAS com uma instancia de SecurityPermission. O codigo para fazer uma demanda do CAS parece que isto respondeu Jul 12 09 as 14:32 OK, esta e uma otima informacao. Isso abrange a parte b do Q3. Mas e quanto a parte de como faco para obter a compilacao JIT para ter sucesso Posso marcar meu metodo com um atributo de seguranca ou. Lembre-se, minha teoria e que o erro SecurityPermission nao esta acontecendo no tempo de execucao, esta acontecendo durante o JIT - e acho que voce confirmou que isso e possivel. Entao, a questao e, como escrevo o codigo para permitir que o JIT compile. Ndash Cheeso 12 de julho de 09 as 15:50 Isso deveria estar acontecendo no tempo de execucao, caso contrario a montagem nao seria mesmo carregada - e para que isso aconteca, a montagem precisa ser marcada como exigindo a permissao. Mesmo assim, isso provavelmente e uma verificacao de tempo de execucao, pois isso ocorrera na carga de montagem, que pode ser em tempo de execucao. Ndash blowdart Jul 12 09 as 16:24 Tipos diferentes de checagem, as demandas de links sao atributos em um metodo e, de fato, sao verificadas no tempo JIT. E muito usado pela propria estrutura e e raro ve-lo fora da fonte CLR. O que eu demonstrei e uma demanda imperativa, nao uma declarativa como uma SecurityPermission (SecurityAction. LinkDemand, Unrestricted true) ndash blowdart Jul 12 09 em 18: 55285 exceptionInfo. scode Marshal. GetHRForException (e) 341 return Marshal. GetHRForException (e) 114 Marshal de retorno. GetHRForException (e) 186 exceptionInfo. scode Marshal. GetHRForException (e) 45 return new ReturnMessage (DiagnosticUtility. ExceptionUtility. ThrowHelperError (nova COMException (e. GetBaseException (). Message, Marshal. GetHRForException (e. GetBaseException ()))), msg) 61 retorna ReturnMessage (DiagnosticUtility. ExceptionUtility. ThrowHelperError (nova COMException (returnMsg. Exception. GetBaseException (). Message, Marshal. GetHRForException (returnMsg. Exception. GetBaseException ()))), msg) 25 listenerChannelCallback. ReportStopped (Marshal. GetHRForException (ex)) 25 listenerChannelCallback. ReportStopped (System. Runtime. InteropServices. Marshal. GetHRForException (ex))