Tuesday 19 September 2017

Gethrforexception Ioexception Wenn Versuchen


Ich habe einige IO-Code, der einen Stream innerhalb eines try..catch liest. Es fängt IOException und ruft System. Runtime. InteropServices. Marshal. GetHRForException () innerhalb des Fangs, in einem Versuch, verschiedene Aktionen auf der Grundlage der HResult zu nehmen. So etwas wie dieses: Aber diesen Code in ASP mit trustmedium ausführen, bekomme ich diese Ausnahme: Ein paar Fragen: Ich denke, die Ausnahme ist aufgetreten, weil GetHRForException ruft in nicht verwalteten Code, der nicht in Medium Vertrauen erlaubt ist. Korrigieren Diese Ausnahme wird geworfen, nicht zum Zeitpunkt der Ausführung von GetHRForException, aber zum Zeitpunkt der Methode wird JITed - Correct (Der stacktrace zeigt meine Methode, aber ich bin 99 sicher, dass eine IO-Ausnahme nicht aufgetreten ist) Wenn ja, Gibt es eine Möglichkeit für mich, das Verhalten in einer partiellen Vertrauensumgebung zu variieren, so dass ich nicht die GetHRForException (unmanaged Code) aufrufen, wo es nicht erlaubt ist Mit anderen Worten, wie kann ich dem JIT erlauben, zum Zeitpunkt der Kompilierung erfolgreich zu sein, während auch Auswertung zur Laufzeit, ob der Code GetHRForException () aufrufen sollte So etwas wie dies: Ich denke, es gibt einen Laufzeitmechanismus für den Test, wenn Berechtigungen verfügbar sind, aber havent in der Lage, es zu finden. BEARBEITEN. Ist dieser Blog-Artikel die Antwort ShawnFa von Microsoft sagt, dass Sie nicht versuchen können. Catch (SecurityException) um eine Methode, die durch einen LinkDemand geschützt ist. Wenn MethodA () MethodB () aufruft und MethodB () mit LinkDemand für vollständige Vertrauenswürdigkeit markiert wird, wird der LinkDemand überprüft, wobei MethodA Jited ist. Daher muss ich die Marshal. GetHRForException in eine separate Methode extrahieren, um die SecurityException zu vermeiden. Ist das korrekt Auf meinen Code angewendet, kann MethodA () der Code sein, der Read aufruft und dann im catch versucht, GetHRForException () aufzurufen. GetHRForException ist MethodB (). Der LinkDemand wird ausgewertet, wenn MethodA () JITd ist. (Dieser LinkDemand schlägt in meinem Medium vertrauen ASP-Szenario). Wenn ich die Methode GetHRForException in eine neue Methode MethodC () verschieben und MethodC () nur bedingt aufrufen muss, nachdem eine imperative permission. Demand () erfolgreich ist, sollte ich die SecurityException an der JIT-Zeit vermeiden können, da MethodC () sein wird JITd nur, nachdem die Berechtigung. Demain () erfolgreich ist. Gesendet am Jul 12 09 um 14:20 Die Methode erforderlich ist, SecurityPermission. IsUnrestricted (). Es gibt eine true oder false, die angibt, ob die Berechtigung erlaubt ist oder nicht. Es erfordert keine Berechtigung, ebenso wie SecurityPermission. Demand (). Ich benutze IsUnresticted mit SecurityPermissionFlag. UnmanagedCode, um zu sehen, ob die Assembly darf nicht verwalteten Code aufrufen, und rufen Sie den nicht verwalteten Code nur, wenn erlaubt. Es gibt einen zusätzlichen Twist. Der JIT-Compiler prüft beim Kompilieren einer Methode nach CodeAccessPermission LinkDemands auf einer beliebigen Methode, die als die zu kompilierende Methode bezeichnet wird. Marshal. GetHRForException () ist mit einem LinkDemand markiert. Daher wird meine Methode, die Marshal. GetHRForException () aufruft, eine uncatchable SecurityException zum Zeitpunkt der JIT-Kompilierung werfen, wenn sie in einer beschränkten Umgebung wie ASP mit mittlerer Vertrauenswürdigkeit ausgeführt wird. Daher muss man die Methode, die Marshal. GetHRForException () in diesem Fall aufruft, niemals JIT aufrufen, was bedeutet, dass ich Marshal. GetHRForException () in eine separate Methode in meinem Code auflösen muss, der aufgerufen wird (und somit JITted) nur dann, wenn UnmanagedCode ist uneingeschränkt. Heres einige Beispiel-Code: beantwortet Jul 20 09 at 17:56 Ja - mittlere Vertrauen wird nicht zulassen, Anrufe in nicht verwalteten Code. Die einzige Vertrauensstufe, die es zulässt, ist volles Vertrauen. Es hängt davon ab, ob. CAS-Anforderungen können zur Laufzeit stattfinden, aber die Hosting-Umgebung kann auch auf eine Wanderung gehen und für Dinge, die es nicht tun kann. Sie können testen, um festzustellen, ob Sie einen nicht verwalteten Code anrufen können, indem Sie eine CAS-Anfrage mit einer Instanz von SecurityPermission verwenden. Der Code, um eine CAS-Nachfrage sieht aus wie dies beantwortet werden. Dies deckt Teil b von Q3 ab. Aber was ist mit Teil a Wie bekomme ich die JIT-Kompilierung zum Erfolg Kann ich meine Methode mit einem Sicherheitsattribut oder markieren. Denken Sie daran, meine Theorie ist, dass der SecurityPermission-Fehler nicht zur Laufzeit geschieht, es geschieht während JIT - und ich denke, Sie bestätigt, dass dies möglich ist. Also die Frage ist, wie schreibe ich den Code, damit die JIT zu kompilieren. Ndash Cheeso Es sollte zur Laufzeit geschehen, sonst würde die Baugruppe nicht laden - und dafür muss die Baugruppe markiert werden, da die Erlaubnis erforderlich ist. Selbst dann that39s wohl ein Laufzeit-Check, wie es auf Montage Belastung, die zur Laufzeit sein könnte passieren wird. Ndash blowdart Unterschiedliche Art der Überprüfung, Link-Anforderungen sind Attribute auf eine Methode, und werden tatsächlich bei JIT-Zeit überprüft. It39s ziemlich viel von dem Rahmen selbst verwendet und es ist selten, es außerhalb der CLR-Quelle zu sehen. Was ich demonstrieren ist eine zwingende Forderung, nicht eine deklarative wie eine SecurityPermission (SecurityAction. LinkDemand, unbeschränkt true) ndash Blade-Darts 12. Juli um 18: 55Putting It All Together Die vorherigen Abschnitte beschrieben, wie die try zu konstruieren. Fang. Und schließlich Codeblöcke für die writeList-Methode in der ListOfNumbers-Klasse. Jetzt gehen wir durch den Code und untersuchen, was passieren kann. Wenn alle Komponenten zusammengefügt werden, sieht die writeList-Methode wie folgt aus. Wie bereits erwähnt, hat diese Methode versucht Block hat drei verschiedene Ausfahrt Möglichkeiten sind hier zwei von ihnen. Code in der try - Anweisung schlägt fehl und wirft eine Ausnahme aus. Dies kann eine IOException sein, die durch die neue FileWriter-Anweisung oder eine IndexOutOfBoundsException verursacht wird, die durch einen falschen Indexwert in der for-Schleife verursacht wird. Alles gelingt und die try-Anweisung wird normal beendet. Let39s schauen, was in der writeList-Methode während dieser beiden Exit-Möglichkeiten geschieht. Szenario 1: Eine Ausnahme tritt auf Die Anweisung, die einen FileWriter erstellt, kann aus einer Reihe von Gründen fehlschlagen. Beispielsweise wirft der Konstruktor für den FileWriter eine IOException aus, wenn das Programm die angezeigte Datei nicht erstellen oder schreiben kann. Wenn FileWriter eine IOException auslöst. Das Runtime-System sofort stoppt die Ausführung der try-Block-Methode Anrufe ausgeführt werden nicht abgeschlossen. Das Runtime-System beginnt dann mit dem Suchen am Anfang des Methodenaufruf-Stapels für einen geeigneten Ausnahme-Handler. In diesem Beispiel befindet sich der FileWriter-Konstruktor, wenn die IOException auftritt, am Anfang des Aufruf-Stacks. Der FileWriter-Konstruktor hat jedoch keinen geeigneten Ausnahmebehandler, sodass das Laufzeitsystem die Methode 151 der Methode 151 im Methodenaufrufstapel überprüft. Die writeList-Methode hat zwei Ausnahmehandler: eine für IOException und eine für IndexOutOfBoundsException. Das Laufzeitsystem prüft die Handler der writeList 39s in der Reihenfolge, in der sie nach der try - Anweisung erscheinen. Das Argument für den ersten Exception-Handler ist IndexOutOfBoundsException. Dies stimmt nicht mit der Art der ausgelösten Ausnahme überein, sodass das Runtime-System den nächsten Exception-Handler überprüft. IOException. Dies entspricht der Art der ausgelösten Exception, so dass das Runtime-System seine Suche nach einem geeigneten Exception-Handler beendet. Nachdem die Laufzeit einen geeigneten Handler gefunden hat, wird der Code in diesem catch-Block ausgeführt. Nachdem das Exception-Handler ausgeführt wird, übergibt das Laufzeitsystem die Steuerung an den finally-Block. Code in der endgültigen Block ausgeführt, unabhängig von der Ausnahme über sie gefangen. In diesem Szenario wurde der FileWriter nie geöffnet und doesn39t muss geschlossen werden. Nachdem der endgültige Block die Ausführung beendet hat, fährt das Programm mit der ersten Anweisung nach dem endgültigen Block fort. Hierbei handelt es sich um die vollständige Ausgabe aus dem Programm ListOfNumbers, das beim Auslösen einer IOException angezeigt wird. Der fettgedruckte Code in der folgenden Auflistung zeigt die Anweisungen, die während dieses Szenarios ausgeführt werden: Szenario 2: Der try-Block beendet Normal In diesem Szenario werden alle Anweisungen innerhalb des Bereichs des try-Blocks erfolgreich ausgeführt und werfen keine Ausnahmen. Die Ausführung fällt vom Ende des try-Blocks ab, und das Laufzeitsystem übergibt die Steuerung an den endgültigen Block. Da alles erfolgreich war, ist der PrintWriter geöffnet, wenn die Steuerung den endgültigen Block erreicht, der den PrintWriter schließt. Wiederum, nachdem der endgültige Block die Ausführung beendet hat, fährt das Programm mit der ersten Anweisung nach dem letzten Block fort. Hier ist die Ausgabe aus dem Programm ListOfNumbers, wenn keine Ausnahmen geworfen werden. Der fett gedruckte Code in dem folgenden Beispiel zeigt die Anweisungen, die während dieses Szenarios ausgeführt werden.

No comments:

Post a Comment