Saturday 28 October 2017

Gethrforexception Beispiele


Ich finde, dass manchmal in IO-Operationen gemeinsame IOException geworfen wird. Ich kann Marshal. GetHRForException (Exception e) - Methode (hier gefunden), um den spezifischen Fehlercode zu bestimmen. Danach möchte ich eine Ausnahme wieder auslösen, indem ich meinen anwendungsspezifischen Fehlercode verwende, um dem Benutzer einige Tipps zu geben, was falsch gelaufen ist. Aber ich war nicht in der Lage, die Liste der möglichen HResult Werte für IOException zu finden. Eine weitere Sache Im stecken mit ist, dass für verschiedene HResult-Codes Root-Ursache kann das gleiche sein - zum Beispiel 0x8007052E und 0x80070569 - beide entsprechen Logon-Fehler: unbekannter Benutzername oder schlechtes Passwort. Ich habe versucht, etwas wie IOException HResult Werte suchen, aber es gab nichts besonderes für die Abbildung IOException HResult mit menschlich lesbaren Fehler (wie diese oder diese). Ich habe auch die Frage hier, die sehr ähnlich, aber es gibt noch keine Lösung zu sehen. Also, wo ist die Dokumentation über IOException HResults Werte Mit Marshal. GetHRForException () Sie wickelten den Windows-Fehlercode in einen HResult Fehlercode. Für eine IOException wird es immer die Windows Fehlernummer 0x80070000 sein. Die 8 bedeutet Fehler, die 7 bedeutet, dass es von Windows kam. Sie könnten einfach amp 0xffff, um den ursprünglichen Fehlercode wieder zu erholen. Konvertieren Sie das Ergebnis zurück in die Dezimalzahl und youll haben viele Orte, um herauszufinden, was der Fehlercode bedeutet. Ich persönlich verwende immer die WinError. h SDK-Header-Datei. Hängt davon ab, welche Version von VS Sie haben, werden die meisten Programmierer finden sie zurück im Verzeichnis C: Programmdateien (x86) Microsoft SDKsWindowsv7.1AInclude. Sie haben auch ein praktisches Dienstprogramm zur Verfügung, run errlook. exe aus der Visual Studio-Eingabeaufforderung. Ein guter Weg, um es leicht verfügbar ist, indem Sie es in das Menü Extras. Verwenden Sie Tools External Tools, Schaltfläche Hinzufügen, Titel Fehlersuche, Befehl C: Programmdateien (x86) Microsoft Visual Studio 12.0Common7Toolserrlook. exe. Tweak der Pfad als notwendig, um Ihre VS-Version entsprechen. Youll jetzt auch feststellen, dass die Fehlercodes nicht die gleichen sind. 0x80070569 amp 0xffff 0x569 1385. Die Suche nach WinError. h für diesen Fehlercode liefert ERRORLOGONTYPENOTGRANTED, Anmeldefehler: dem Benutzer wurde nicht der angeforderte Anmeldetyp an diesem Computer gewährt. Die Art der IOException Fehler können Sie nicht in irgendeiner Weise eingeschränkt werden. Windows hat keine Ausnahmevorgaben, nur die häufigsten Fehlercodes werden in der MSDN-Dokumentation für eine bestimmte winapi-Funktion aufgelistet. Ähnlich wie. NET-Ausnahmen. Ein notwendiges Übel, viele IOException-Fehlercodes werden von Treibern generiert, die nicht von Microsoft geschrieben wurden. Ich habe einige IO-Code, der einen Stream liest innerhalb eines try..catch. Es fängt IOException und ruft System. Runtime. InteropServices. Marshal. GetHRForException () innerhalb der catch, in einem Versuch, verschiedene Aktionen auf der Grundlage der HResult nehmen. So etwas wie dieses: Aber diesen Code in ASP. NET 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 variieren, so dass ich nicht rufen Sie die GetHRForException (nicht verwalteten Code), 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. Deshalb, um die SecurityException zu vermeiden, muss ich Marshal. GetHRForException in eine separate Methode extrahieren. 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. NET-Szenario). Wenn ich die GetHRForException in eine neue Methode MethodC () verschieben und MethodC () nur bedingt aufrufen, nachdem eine imperative permission. Demand () erfolgreich ist, sollte ich theoretisch die SecurityException an der JIT-Zeit vermeiden können, da MethodC () sein wird JITd nur, nachdem die permission. Demain () erfolgreich ist. Gesendet am Jul 12 09 am 14:20 Die erforderliche Methode 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 zu sehen, wenn 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 jede 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 in einer beschränkten Umgebung wie ASP. NET mit mittlerer Vertrauenswürdigkeit ausgeführt wird. Daher muss man nicht JIT die Methode, die Marshal. GetHRForException () in diesem Fall, was bedeutet, dass ich ausbrechen müssen, Marshal. GetHRForException () in eine separate Methode in meinem Code, 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. 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 Montage wouldn39t sogar laden - und dafür muss die Assembly muss als die Erlaubnis erforderlich markiert werden. Selbst dann that39s wohl ein Laufzeit-Check, wie es bei 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 vom Rahmen selbst verwendet und es ist selten, es außerhalb der CLR-Quelle zu sehen. Was ich demonstrieren ist eine imperative Nachfrage, nicht eine deklarative wie eine SecurityPermission (SecurityAction. LinkDemand, uneingeschränkt true) ndash blowdart Jul 12 09 at 18:55

No comments:

Post a Comment