Thursday 7 September 2017

Maresciallo Gethrforexception Ex


Ho qualche codice IO che legge un flusso all'interno di un try..catch. Cattura IOException e chiama System. Runtime. InteropServices. Marshal. GetHRForException () all'interno della cattura, nel tentativo di intraprendere azioni diverse in base al HResult. Qualcosa di simile a questo: Ma l'esecuzione di questo codice all'interno ASP con trustmedium, ottengo questa eccezione: un paio di domande: Credo che l'eccezione si verifica perché GetHRForException chiama in codice non gestito, che non è permessa a mezzo di fiducia. Corretto è stato gettato Questa eccezione, non è al momento dell'esecuzione di GetHRForException, ma al momento il metodo viene JITed - Corretto (Il stacktrace mostra il mio metodo, ma sono 99 certo che un'eccezione IO non si è verificato) In caso affermativo, c'è un modo per me di variare il comportamento in un ambiente parzialmente attendibile, in modo che io non chiamare il GetHRForException (codice non gestito) in cui non è consentito in altre parole, come posso permettere JIT per avere successo in fase di compilazione, ma anche di valutare in fase di esecuzione se il codice deve chiamare GetHRForException () Qualcosa di simile a questo: penso che ci sia un meccanismo di esecuzione per la prova se i permessi sono disponibili, ma havent stato in grado di trovarlo. EDIT. E 'questo articolo del blog la risposta ShawnFa di Microsoft dice che non si può fare una prova. catch (SecurityException) attorno ad un metodo protetto da un LinkDemand. Se MethodA () chiama MethodB (), e MethodB () è contrassegnato con LinkDemand per la piena fiducia, allora il LinkDemand viene controllato con MethodA è Jited. Pertanto, al fine di evitare la SecurityException, ho bisogno di estrarre Marshal. GetHRForException in un metodo separato. E 'corretto applicata al mio codice, MethodA () potrebbe essere il codice che chiama lettura e quindi il fermo tenta di chiamare GetHRForException (). GetHRForException è MethodB (). Il LinkDemand viene valutata quando MethodA () è JITd. (Questo LinkDemand fallisce nel mio medie fiducia scenario ASP). Se mi muovo il GetHRForException in un nuovo metodo, MethodC (), e condizionatamente chiamo MethodC () solo dopo un permission. Demand imperativo () ha esito positivo, in teoria dovrei essere in grado di evitare il SecurityException in fase di JIT, perché MethodC () sarà JITd solo dopo la permission. Demain () ha esito positivo. chiesto 12 luglio 09 alle 14:20 Il metodo di richiesta è SecurityPermission. IsUnrestricted (). Esso restituisce un vero o falso che indica se il permesso è consentito o meno. Non richiede un permesso, come fa SecurityPermission. Demand (). Io uso IsUnresticted con SecurityPermissionFlag. UnmanagedCode per vedere se l'assemblea è permesso di chiamare il codice non gestito, e quindi chiamare solo il codice non gestito se consentito. C'è un tocco aggiuntivo. Il compilatore JIT, durante la compilazione di un metodo, i controlli per LinkDemands CodeAccessPermission su qualsiasi metodo chiamato il mio metodo per essere compilato. Marshal. GetHRForException () è contrassegnato da un LinkDemand. Quindi, il mio metodo che chiama Marshal. GetHRForException () genera un SecurityException imprendibile al momento della compilazione JIT, quando viene eseguito in un ambiente ristretto, come ASP con attendibilità media. Pertanto, non dobbiamo mai JIT il metodo che chiama Marshal. GetHRForException () in quel caso, il che significa che ho bisogno di uscire Marshal. GetHRForException () in un metodo separato nel mio codice che si chiama (e quindi JITted) solo quando è UnmanagedCode senza restrizioni. Ecco qualche esempio di codice: risposta 20 luglio 09 a 17:56 Sì - attendibilità media non permetterà chiamate in codice non gestito. L'unico livello di fiducia che permette è pieno di fiducia. Dipende. richieste CAS possono avvenire in fase di esecuzione, ma l'ambiente di hosting può anche andare su una passeggiata e cercare le cose che non posso fare. È possibile verificare per vedere se è possibile effettuare una chiamata al codice non gestito utilizzando una domanda CAS con un'istanza di SecurityPermission. Il codice per fare una domanda CAS si presenta così risposto 12 luglio 09 alle 14:32 OK, questo è grande informazioni. Questo copre parte B del Q3. Ma che dire di una parte di una Come faccio ad avere la compilazione JIT per avere successo Posso segnare il mio metodo con un attributo di sicurezza o. Ricordate, la mia teoria è che l'errore non è SecurityPermission accadendo in fase di esecuzione, sta accadendo durante il JIT - e penso avete confermato che questo è possibile. Quindi la domanda è: come faccio a scrivere il codice per consentire il JIT per compilare. ndash Cheeso 12 luglio 09 alle 15:50 Si dovrebbe accadere in fase di esecuzione, altrimenti la wouldn39t assemblaggio anche carico - e per quel che accada l'assemblea deve essere contrassegnato come richiede il permesso. Anche allora that39s probabilmente un controllo runtime, come accadrà a carico di montaggio, che potrebbe essere in fase di esecuzione. ndash blowdart 12 Luglio 09 in 16:24 diverso tipo di controllo, le richieste di collegamento sono attributi su un metodo, e sono infatti controllati in fase di JIT. It39s praticamente utilizzate dal framework stesso e it39s raro vederlo al di fuori della fonte CLR. Quello che mi dimostrerò è una domanda fondamentale, non un dichiarativa come un SecurityPermission (SecurityAction. LinkDemand, senza restrizioni vero) ndash blowdart 12 luglio 09 alle ore 18: 55.285 exceptionInfo. scode maresciallo. GetHRForException (e) 341 ritorno maresciallo. GetHRForException (e) 114 ritorno maresciallo. GetHRForException (e) 186 exceptionInfo. scode maresciallo. GetHRForException (e) 45 return new ReturnMessage (DiagnosticUtility. ExceptionUtility. ThrowHelperError (nuova COMException (e. GetBaseException (). Messaggio, il maresciallo. GetHRForException (e. GetBaseException ()))), MSG) 61 ritorno nuova ReturnMessage (DiagnosticUtility. ExceptionUtility. ThrowHelperError (nuova COMException (returnMsg. Exception. GetBaseException (). Messaggio, il maresciallo. GetHRForException (returnMsg. Exception. GetBaseException ()))), MSG) 25 listenerChannelCallback. ReportStopped (Marshal. GetHRForException (ex)) 25 listenerChannelCallback. ReportStopped (sistema. Runtime. InteropServices. Marshal. GetHRForException (ex))

No comments:

Post a Comment