Gethrforexception Ioexception Defekt


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 ein deklarativer wie ein SecurityPermission (SecurityAction. LinkDemand, unbeschränkte true) ndash blowdart 08-18-08Marshal. GetHRForException hat mehr als nur Get-HR-For-Exception Let8217s ersten Start durch suchen Bei einem kleinen Code-Snippet: Das sieht ganz gut aus, nicht wirklich. Es stellt sich heraus, diese API ist eigentlich schlecht benannt, und es tatsächlich mehr als nur Abrufen der HR aus dem Ausnahmeobjekt. Mit dieser API falsch können Sie einige seltsame Probleme, wie das Auswerfen einer falschen, alten Ausnahme. Also, was bedeutet die API tatsächlich tun Neben der Rückgabe Sie die HRESULT, diese Funktion setzt auch das aktuelle Thread IErrorInfo-Objekt das Ausnahmeobjekt sein. Jeder Thread hat ein assoziertes IErrorInfo COM-Objekt, standardmäßig auf NULL. Dieses IErrorInfo-Objekt repräsentiert den Fehler des letzten COM-API-Aufrufs, der wie die GetLastError () - Win32-API oder errno-C-API ist. Von dem IErrorInfo-Objekt können Sie weitere Informationen wie die Fehlerbeschreibung, Hilfedatei Kontext, etc, erhalten, die Ihnen weitere Informationen über den Fehler. Durch das Setzen des IErrorInfo-Objekts auf das Ausnahmeobjekt (eigentlich auf die IErrorInfo-Implementierung des Ausnahmeobjekts, das von allen verwalteten Objekten freigegeben wird), erzählen Sie im Wesentlichen Ihren COM-Aufrufern, quothey, es gibt einen Fehler, it8217s dieses Ausnahmeobjekt und Sollten Sie etwas über itquot tun, was offensichtlich eine schlechte Idee ist, wenn Sie nur den HR abrufen möchten. In vielen Fällen könnte dies unbemerkt gehen, wenn Ihr COM callercallee IErrorInfo korrekt behandelt. Ich denke, sie folgen dem COM IErrorInfo-Protokoll, die im Grunde sind: 1. Der Anrufer verwenden IErrorInfo aus dem aktuellen Thread beim Aufruf einer COM-Schnittstelle, die explizit sagt, dass ich IErrorInfoquot 2. Die callee (die die COM-Schnittstelle implementiert) sagt, dass sagt QuotI Support IErrorInfoquot, muss IErrorInfo vor der Rückgabe löschen. Dies ist sehr ähnlich zu GetLastError () errno, rechts Wenn dies der Fall ist, würde die falsch eingestellte IErrorInfo in den Thread, würde normalerweise entweder überschrieben werden, durch einige Interface-Implementierung, die IErrorInfo unterstützt oder ignoriert. Jedoch, weil das Protokoll, das ich beschrieben wurde, von jedem COM-Entwickler wirklich nicht sehr gut verstanden wird, I8217ve häufig gesehen Fälle, in denen die COM-Komponente gerade quotsure sagt, stütze ich IErrorInfo auf jedem COM interfacequot und sie don8217t setclear IErrorInfo überhaupt. Und dann würde der Anrufer dieser schlecht implizierten COM-Schnittstelle würde am Ende mit dem IErrorInfo durch GetHRForException Aufruf früher gesetzt und ist zu glauben, dass es einen Fehler. Zum Beispiel betrachten let8217s das folgende Szenario: Einige COM-Komponente A Aufrufe in Code-Code werfen eine Ausnahme, sagen IOException-Code fängt die Ausnahme, und rufen Sie Marshal. GetHRForException, die IErrorInfo auf diese Ausnahme IOException-Code aufruft, in eine andere COM-Komponente B, Aufrufe aufruft In IB. Func IB. Func fehlgeschlagen und zurückgeben einige HR-Fehler-Code, sagen EOUTOFMEMORY CLR sieht die HR-Fehlercode und fragen Sie die COM-Komponente B quotdo Sie unterstützen IErrorInfoquot, und B Antworten quotsure, warum notquot, außer es doesn8217t wirklich unterstützen und Es doesn8217t setclear IErrorInfo CLR abrufen die IErrorInfo, und sieht, dass es sich tatsächlich um eine verwaltete Ausnahme, und wirft die IOException Ausnahme statt OutOfMemoryException. Jetzt könnten Sie sich fragen: Was ist diese API wirklich für den ersten Platz gedacht Es ist tatsächlich in Orten in COM interop verwendet, wo Sie die HRESULT zurückgeben und setzen Sie IErrorInfo selbst. Das tut sich sehr oft 8211 die meisten Menschen wäre glücklich genug, um COM Interop kümmert sich um diesen Teil durch die Umwandlung von Exception in HR und IErrorInfo (die geschieht, um Marshal. GetHRForException aufrufen). So, wenn Sie nicht wirklich wissen, was Sie tun, ist mein Rat, weg von Marshal. GetHRForException zu bleiben. Was, wenn Sie wirklich, wirklich wollen, um nur die HRESULT für eine bestimmte Ausnahme Sie sollten Exception. HResult Eigenschaft verwenden.

Comments

Popular posts from this blog

Fundamentalanalyse Forex Signal

Forex Dong Barchart Sept 2014

Forexpeoples Forum